ひまつぶし雑記帖

doncha.net制作・発行:KindleやiBooks、楽天kobo、BOOK☆WALKERで読む電子書籍

perlで扱うutf8フラグやutf-8-macの小ネタ

2014/1/12 [17:40:36] (日) 天気

perlのスクリプトでmacの日本語ファイル名がマッチしない、という話題がtwitterに上がっていた。ネタ的に面白そうなので自分でも試してみたところ、macの日本語ファイル名が正規表現で一致しないことに気づいて、ちょっと吃驚。

フォルダには
・test.txt
・あいうえお
・ペダル
・memo.txt
など、アルファベットのファイルや日本語ファイル・フォルダが雑多に入っている。
この中から「あいうえお」と「ペダル」だけを検索で引っ張り出したい。というのが以下のスクリプト。

ところが、これでヒットするのは「あいうえお」だけで、「ペダル」はヒットしない。

twitterでの流れを追うとどうやらmacのファイルシステムが(日本語ファイル名に)使うのは NFD という形式らしい(Normalization Form Canonical Decomposition)。これをperlで判定するためには NFC という形式に変換してやる必要がある(Normalization Form Canonical Composition)

NFDとNFCで問題になるのが。
・濁音などがはいると文字コードが違ってくる。
・macの場合はさらに一般的なNFDではなくて、utf-8-mac というちょっと特殊なもの。

『Geekのメモ: Mac OS Xのファイルシステムの文字コード』
↑こちらのページが具体的でわかりやすかった(感謝!)

お馴染みの Data::Dumper で読み込んだファイル名と、スクリプト内の文字を比べると、文字コードが違っていた。まさに上記した utf-8-mac の問題。「あいうえお」は濁音が混じってないので文字コードは同じだけど、「ペダル」は濁音部分で文字コードが違っていた・文字長が増えていた。

上記サイトを参考に、CPANから Text::Iconv をダウンロード、インストールしてテストスクリプト。
1)ファイル名を utf-8-mac から、utf-8に変換する。
2)変換したファイル名にutf8フラグをつける。

↑で、無事確認できた。



ついでに。utf8フラグのおさらい。

文字コードのutf8とperl のutf8フラグは別モノ。

perlがスクリプトで内部処理するのにつけるのがutf8フラグということ…って、素人のわたしはよくわかってないので検証。

コマンドラインで引数に渡したファイルを読み込んで、「弱虫ペダル」を含んだ行を出力(プリント)するだけの単純なスクリプト。

・スクリプト自体は文字コード、utf8で書かれている。
・「弱虫ペダル」は文字コードがutf8で、 use utf8 によって、perl の utf8フラグがついている。
・最初の if 文は、utf8フラグのついていないテキストと、utf8フラグのついた「弱虫ペダル」の比較なのでヒットしない。
・Encode::decode で読み込んだファイルのテキストにutf8フラグをつける。
 ENCODE-NAMEはファイルの文字コード。shiftjis、 utf8など。
・次の if 文は utf8フラグのついているテキストと、utf8フラグのついた「弱虫ペダル」の比較なので文字コードが * shiftjisだろうがutf8だろうが * ヒットする。

・スクリプトの文字コードはutf8でも、use utf8をつけない場合(スクリプトにutf8フラグがつかない場合)
・「弱虫ペダル」は文字コードがutf8で、perl の utf8フラグはついていない。
・最初の if 文では入力ファイルの文字コードが utf8 のものだけがヒットする。
・Encode::decode で読み込んだファイルのテキストに utf8 フラグをつける。
・次の if 文は utf8 フラグがついているテキストと、utf8フラグのついていない「弱虫ペダル」の比較なのでどれもヒットしない。

perl の utf8 フラグをつけることによって、スクリプトや、入力されるテキストの文字コードは何でも構わない、という超便利なフラグ(decodeで正しい文字コードを指定する必要はあるけど)

perlのutf8フラグネタでは以前  「utf8移行と自分メモその2」  こっちにも覚え書き(utf8フラグをつけたスクリプトは、変数に日本語が使える、というネタはこちら)

encodeネタでは変換に失敗する文字をチェックするのにencodeの第3引数に、というネタも  「メモ encodeで変換失敗を第三引数でフォロー」  …ほんと、なんちゅーかほんちゅーか。面倒くさい。



話の発端からtwitterを追ってみると、utf16だったことが原因だったということでした。
て、utf16使う状況があるのか!?参考になります。ううううむ。難物。

»電子書籍制作代行についてはこちら

profile

profile

 
doncha.net
contact:
»運営者
@t2aki@tokoroten.doncha.net

ところてんx5

2024/4/25 00:49

だめだ。PDFをWordで開いたらレイアウトが微妙にくずれて行数が正しくない。かえって間違いのもとだ。

2024/4/24 13:43

pdfをWordで開いてみる手もあるか。空行、1ページの行数とか、pdfのまんまだったら行数表示で問題解決。だけど、実際どうだろ。帰ったら試す

2024/4/24 12:58

空行は目視しか確認方法がない…
windowsで半透明にするフリーソフトを見つけたので、各ページの幅で検知する。
全ページの行数を数えてたんじゃ絶対漏らす。そんな集中力はないわ

検索
<<2024/4>>
 123456
78910111213
14151617181920
21222324252627
282930

リンク

WINDOWS版サウンドノベル
おかえりください PC WINDOWS版サウンドノベル
『おかえりください』体験版