読者です 読者をやめる 読者になる 読者になる

ヨヨギ産のブログ

明日になったら、今日は過去。

Macで作った濁点・半濁点入りのファイル名をWindowsで扱うときの罠

プログラミング

http://www.flickr.com/photos/30441956@N05/5431361136
photo by Slayer925

Macでファイルやフォルダを作成して、それをメールで送ったり、LAN経由で取り込む際にしばしば「ファイル名の文字化け」が起こります。これはMac文字コードが「UTF-8-Mac」であるために起こります。

特に厄介なのは、濁点・半濁点入りのファイル名です。例えば「ハンドバッグ.jpeg」とか「ペペロンチーノ.gif」とかの場合です。

UTF-8-Mac」では、濁点・半濁点文字、例えば「」を「」と「」、「」を「」と「」を合成して表現します。つまり、文字コードが異なるわけです。

しかし、Windowsエクスプローラーでは、これをちゃんと認識して「パパとじいじ.jpg」と言う風に、違和感無く表示してくれちゃいます。

ここまでは「Windows賢いな~」なんですが、この後が厄介。

この「パパとじいじ.jpg」のパスをAccessExcelなどに登録しておいて、検索ワードとして「パパ」と打ち込んで検索しようとすると、この「パパとじいじ.jpg」は検索に引っかかってしません。打ち込んだ「パパ」とDBに登録されている「ハ゜ハ゜」は文字コードが違うからです。Windows上での見た目はちゃんと表示されているのに、文字コード上は違っているという・・・。

そこで、Macの濁点・半濁点を1文字濁点・半濁点文字に強引に変換するVBAを作ってみました。

 

Function macDakuten(str As String) As String
   
    '文字コード「UTF-8-Mac」の「濁点なし」+「濁点・半濁点」
    '⇒「濁点・半濁点付き1文字」に変換
    '例:「か」+「゛」⇒「が」 「は」+「゜」⇒「ぱ」 
    '「ウ」+「゛」⇒「ヴ」
    '「か行」「さ行」「た行」「は行」のひらがな(25文字)と
    'カタカナ(25文字)、それと「ゔ」「ヴ」が対象となる
   
    '16進数の文字コードに変換して、濁点は「文字コードに1を加える」、
    '半濁点は「文字コードに2を加える」
    '2文字を1文字に(濁点・半濁点部分は削除)
    If IsNull(str) then Exit Sub
    Dim i As Long
    Dim arrHira() As String
    Dim arrKata() As String
    Dim h as String, k as String          'ひらがな、カタカナ (濁点なし)
    Dim h1 as String, k1 as String      'ひらがな、カタカナ(濁点あり)
    Dim h2 as String ,k2 as String      'ひらがな、カタカナ(半濁点あり)
 
    arrHira = Split("4B,4D,4F,51,53,55,57,59,5B,5D,5F,61,64,66,68,6F,72,75,78,7B", ",")
    arrKata = Split("AB,AD,AF,B1,B3,B5,B7,B9,BB,BD,BF,C1,C4,C6,C8,CF,D2,D5,D8,DB", ",")
    
    For i = 0 To 19 '濁点を付けられる「かな文字」を「濁点なし」+「濁点」⇒「濁点付き1文字」に変換
        h = ChrW(CLng(Val("&H30" & arrHira(i))))        'ひらがな濁点なし  
        k = ChrW(CLng(Val("&H30" & arrKata(i))))        'カタカナ濁点なし
        h1 = ChrW(CLng(Val("&H30" & arrHira(i)) + 1))   'ひらがな濁点あり
        k1 = ChrW(CLng(Val("&H30" & arrKata(i)) + 1))   'カタカナ濁点あり
        h2 = ChrW(CLng(Val("&H30" & arrHira(i)) + 2))   'ひらがな半濁点あり
        k2 = ChrW(CLng(Val("&H30" & arrKata(i)) + 2))   'カタカナ半濁点あり
 
        str = Replace(str, h & ChrW(&H3099), h1, , , vbBinaryCompare)
        str = Replace(str, k & ChrW(&H3099), k1, , , vbBinaryCompare)
        If i > 14 Then '「はひふへほ」なら半濁点もあり
            str = Replace(str, h & ChrW(&H309A), h2, , , vbBinaryCompare)
            str = Replace(str, k & ChrW(&H309A), k2, , , vbBinaryCompare)
        End If
    Next

     '「ゔ」と「ヴ」   
    str = Replace(str, ChrW(&H3046) & ChrW(&H3099), ChrW(&H3094), , , vbBinaryCompare)
    str = Replace(str, ChrW(&H30A6) & ChrW(&H3099), ChrW(&H30F4), , , vbBinaryCompare)
   
    macDakuten = str

End Function

 

ってな感じ。ユーザーにファイル名などを登録させたら、一度この関数を通してから再登録する、といった使い方ができると思います。

APPLE MacBook Air 1.7GHz Core i5/11.6/4G/64GB MD223J/A

APPLE MacBook Air 1.7GHz Core i5/11.6/4G/64GB MD223J/A