アフィリエイト広告を利用しています

2020年04月17日

写真データファイルに付く番号について_その2


写真に付けられている名前に

日付と時刻を自動的に付加するスクリプトを作成する

スクリプトを作ってふり直してみた

元のファイル名は「DSC_0171.JPG」だが、

ブログにアップロードしてみると、

タイトルは「2020‎03‎06_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="‎2020‎03‎06_1048_DSC_0171.JPG"
border="0"></a></div>



このテキストに対しファイル名一覧から名前を

順番に置き換え、

ブログの写真添付文章を作っている

こんな名前になってしまったら、

スクリプトが動かせない

あくまでもファイル名は、

「2020‎03‎06_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進と言う言葉もあまり見かけなくなった



前出の「2020‎03‎06_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についてのブログでも書こうかと

案を練っているところだ


20200306_1048_DSC_0171b.JPG
















※画像をクリックすると拡大表示します







タグ:スクリプト
posted by kaz at 16:59 | Comment(0) | TrackBack(0) | プログラム
リンク
access:
online:
ファン
検索
<< 2020年04月 >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    
最新記事
最新コメント
オレンジ色の猫が by オーナー (02/06)
オレンジ色の猫が by 翠星石 (01/23)
ドローンを修理する by kaz (03/14)
ドローンを修理する by obayashi (03/10)
タグクラウド
カテゴリアーカイブ
プロフィール