2020年04月17日
写真データファイルに付く番号について_その2
写真に付けられている名前に
日付と時刻を自動的に付加するスクリプトを作成する
スクリプトを作ってふり直してみた
元のファイル名は「DSC_0171.JPG」だが、
ブログにアップロードしてみると、
タイトルは「20200306_1048_DSC_0171.JPG」
となっている
しかしブログ文面に写真を貼り付けてみると、
ファイル名は
「E2808E2020E2808E03E2808E06_1048_DSC_0171.JPG」
となってしまった
実際のブログのテキストは、
<div style="text-align: center;"><a href="/dragonfl/file/undefined
/E2808E2020E2808E03E2808E06_1048_DSC_0171.JPG" target="_blank"><mg src="/dragonfl/file/undefined
/E2808E2020E2808E03E2808E06_1048_DSC_0171-thumbnail2.JPG" alt="20200306_1048_DSC_0171.JPG"
border="0"></a></div>
このテキストに対しファイル名一覧から名前を
順番に置き換え、
ブログの写真添付文章を作っている
こんな名前になってしまったら、
スクリプトが動かせない
あくまでもファイル名は、
「20200306_1048_DSC_0171.JPG」なのだから
これは今の文字体系UTF-8に関係すると考えた
最近の文字体系は複雑すぎる
それこそ昔は文字を1バイトで表現していた
1バイトとは8ビットで成り立つ
1ビットとはスイッチ1個と考えればよい
オンとオフで判断する
オンが1でオフがゼロだ
それを8個並べると、11111111
2進数で計算すると、
2^8=256だから256文字を表現できる
この中には数字と記号とアルファベットと
カナ文字が入っている
いや入っているのではなく、
単なる約束である
コードが「0x30」だったらゼロ「0」だよ
だから「0」と言うイメージを表示してね
と言うことだ
0xとは16進表示と言うこと
16進表示とは、一桁で0123456789ABCDEF
まで表すことができる
あくまでも一桁なので10以上はABCDEFとなる
1バイト文字の時は複数のコード表が用意されていて、
コード表を切り替えて
グラフィック文字や罫線を表現した
もっと古い話をすれば、
4ビットで数字を表していた
これを、デジットと呼ぶ
0000、全部オンで、1111
2進数だから値で表すと、
1+2+4+8で15、一桁で表すとFになる
私がコンピュータを始めた頃は、
この1バイトのコード体系ををEBCDIC、
(Extended Binary Coded Decimal Interchange Code、
エバックディック、拡張二進化十進コード)と呼んでいた
のちにASCII(American Standard Code for Information Interchange)
が現れ、
漢字を表すためにシフトJIS(Shift_JIS)なるものができた
半角文字と呼ばれるものは1バイトで表現できるが、
漢字は数が多いため1バイトでは表現しきれず、
2バイトが必要になった
2バイトでコードを表現すると、
2^16=65、536個の文字を管理することができる
この2バイト文字を全角文字と呼ぶ
しかしこの頃はまだグローバル化があまり進んでおらず、
企業内のシステムなどが主流であったため、
他国のことなど考える必要もなかった
きちんとしたルールも決められておらず、
半角以外のその国独自の文字などは
自由に空いているコード表の中に埋め込まれてしまった
インターネットなどが普及してくると、
他国で作られた文章などに文字化けが起きてきた
統一されていないのだから当然のことである
例えば、日本では漢字を割りふっている場所に、
中国ではそこに中国語が割り振られてくる
だからパソコンを立ち上げる時に、
言語国の指定が必要になってくる
そこで登場したのが、
Unicodeと呼ばれるもので、
これは文字コードの国際的な業界標準の一つで、
世界中の様々な言語の文字を収録し通し番号を割り当て、
同じコード体系のもとで文字を使用できるように
したものだ
しかし一長一短でそのまま使われることもなく、
例のごとくいろいろなものが派生してくる
その中で今一般的に使われているのがUTF-8
と言う規格で、
ASCIIと同じ部分は1バイトで文字を表現し、
そのほかの部分を2〜4バイトで表現する
可変長の符号化方式と呼ばれるものだ
話がそれてきているけれど、
そういう流れで文字に対する処理が
複雑になってきている
目に見える文字で中のコードを
判別できなくなってきている
また昔のことになってしまうが、
昔は半角全角が目で判断できたものが、
今では判別できない
ごちゃまぜである
コードと文字が1:1で表されていたものが、
今では1:nとなってきている
表に現れている文字の後ろに何があるのかが解からない
16進と言う言葉もあまり見かけなくなった
前出の「20200306_1048_DSC_0171.JPG」が
ブログにアップすると
「E2808E2020E2808E03E2808E06_1048_DSC_0171.JPG」
と言う名前になったのはなぜか
スクリプトが返してきた文字は、
「?2020/?03/?06 ??10:48」であって、
16進で表記すると、
「0x3F323032302F3F30332F3F3036203F3F31303A3438」
である
今まで文字コードがどうのこうと言って来たし、
それで時間を大分つぶしてしまったが、
どうも文字コードが原因ではなさそうだ
ネットで「E2808」を調べて見るが、
サーバー側の文字変換で出現してきているようだ
たぶんサーバー側はPHPなどで作られていると思うから、
これ以上はもう私には解からない
しかし、スクリプトから返される日付情報に
余計なコードがあるのは見て明らかである
文字表示である「?」をコードで見ると「0x3F」が
どうも悪さをしている
ならば取ってしまおう
と言うことで
スクリプトではこの「0x3F」を除くことにする
出来上がったスクリプトで名前を置き換え
ブログにアップロードする
文字化けも起こらず
タイトルとファイル名も一致した
スクリプトがなぜ'0x3F'を付加して来たかは
未だ不明である
ファイル名に日付時刻を付加するスクリプトは
以下通り
'======================================================
'フォルダ単位の名前の変更を行う、但しJPG及びGIFを対象とす
'既存のファイル名の先頭に撮影日付と時刻を追加する
'形式は、yyyymmdd-hhmm_既存名.JPGとする <---hhmmが3桁の場合があるので頭ゼロで4桁固定とする 20190520
'
'対象フォルダにこのスクリプトを配置し、スクリプトを実行する
'拡張子は大文字で統一する 2018.07.20
'======================================================
'
'フォルダ名にスペース等が入っているとエラーになる
'MsgBoxは1バイト文字で最大約1024文字までしか表示出来ない
'
Option Explicit
Const cFiExt = "jpggif" '拡張子JPGとGIFを対象とする
dim FS
dim WShell
dim xMyPath
dim xLen
set FS=CreateObject("Scripting.FileSystemObject")
set WShell=CreateObject("Shell.Application")
'スクリプトのフォルダ名を取得
xMyPath=Replace(WScript.ScriptFullName, WScript.ScriptName, vbNullString)
if right(xMyPath,1)="\" then '右端が"\"の場合この"\"を削除
xLen=Len(xMyPath)
xMyPath=left(xMyPath,(xLen-1))
end if
FileRenameProc(xMyPath)
set FS = Nothing
set WShell=Nothing
'--------------------------------------------------
' ファイル名の変更
'--------------------------------------------------
Function FileRenameProc(pSourceFolder)
dim objFolder,objFiles,objFi,Fi
dim Arr,Arr2,xx,tmp,NewName,LL
dim xLen,Ix
dim getymdhm
dim NewName2
dim objWSFolder
dim xOneChr
dim xDate
dim xTime
dim xHH
dim xMM
Set objFolder = FS.GetFolder(pSourceFolder)
Set objFiles = objFolder.Files
Set objWSFolder=WShell.Namespace(pSourceFolder)
tmp = ""
For Each Fi in objFiles
Arr =Split(Fi.Name,".")
xx = LCase(Arr(1)) 'アルファベットの大文字を小文字に変換
LL = UCase(Arr(1)) 'アルファベットの小文字を大文字に変換
If InStr(cFiExt,xx) > 0 Then
set objFi = FS.GetFile(Fi)
'NewName=Arr(0) & "b" & "." & LL '拡張子は大文字で統一
'GetDetailsOFはWSHのメソッド、12は撮影日時のパラメータ
getymdhm=objWSFolder.GetDetailsOF(objWSFolder.ParseName(Fi.name),12)
'PutInClipboardText getymdhm
'余計な文字"&3F"が入っているので削除
NewName2=""
for Ix=1 to len(getymdhm)
xOneChr=mid(getymdhm,Ix,1)
if Hex(Asc(xOneChr)) <> "3F" then
NewName2=NewName2 + xOneChr
end if
next
Arr2 =Split(NewName2," ")
xDate=Arr2(0)
xTime=Arr2(1)
xDate=Replace(xDate,"/","") '日付の/を外す
xTime=Replace(xTime,":","") '時刻の:を外す
xTime=Right("0"&xTime,4)
NewName2=xDate & "_" & xTime '日付と時刻の間のスペースを_に変更->"-"はエラーになる
Ix=Instr(1,Arr(0),NewName2)
If Ix = 0 Then '
NewName=NewName2 & "_" & Arr(0) & "." & LL '拡張子は大文字で統一
tmp = tmp & Fi.name & "->" & NewName & vbCrLf
objFi.Name = NewName
Else '変更済み若しくは撮影日付がない
tmp = tmp & Fi.name & "->" & " no change" & vbCrLf
End If
End If
Next
MsgBox tmp '表示文字数制限あり
set objFi = Nothing
Set objFiles = Nothing
Set objFolder = Nothing
End Function
'クリップボードに出力
Public Sub PutInClipboardText(ByVal str)
Dim cmd
cmd = "cmd /c ""echo " & str & "| clip"""
CreateObject("WScript.Shell").Run cmd, 0
End Sub
これで写真の管理が楽になった
仕事を離れるとWindowsにこだわる必要がなくなる
何を作ろうかのアイデアも出なくなる
ボケ〜としていたところ、
新しいアイテムを見つけた
Pythonと言う言語
今までBASICが基本だと思っていたが、
人気言語を検索してもBASICが出てこない
今はPythonらしい
Pythonを調べていたらUnixが出てきて、
RaspberryPiなるものに興味が出てきた
今、RaspberryPiにはまってる
今度RaspberryPiについてのブログでも書こうかと
案を練っているところだ
※画像をクリックすると拡大表示します
タグ:スクリプト
【このカテゴリーの最新記事】
-
no image
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/9782634
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック