utf16からutf8に変換

2019/4/25 [13:30:05] (木) 天気

管理ページからダウンロードしたデータがNNNNN.csvという名前なのに、中をみるとタブ区切りでびっくりしてたんだけど、perlでいつものようにごそごそやると文字化け。

エクセルに読み込んで別名保存すればいつもの意図通り。エクセルで保存すると文字コードはcp932、いつも通りになるからだ。


で、文字化けするタブ区切りのcsvファイルの文字コードを確認したらutf16LE BOM付き、でビックリ。ていうかなんでやねん。


これはperlで扱いにくい文字コードで、確か以前悶絶して諦めた記憶。結局一度エクセルなどに読み込ませて別名保存でcp932にしてからperlで処理していた。


今回、頻度ボリュームともけっこうあるので、こんなひと手間をかけたくない。perlだけで処理したい。


ということでぐーぐる様。


WindowsでPerlを使ってUnicode処理(1)

http://blog.livedoor.jp/numa2666/archives/52344850.html

↑こちらのサイトを参考にさせていただきました。ありがとうございます。


わたしの場合、汎用は必要なくて、入力はUTF16LE BOM付、出力はUTF8 BOMなしの決め打ち


UTF16LE BOM付を、UTF8 BOMなしに変換するサブルーチン


sub conv_utf16{
    my $args = shift;

    open(IN, $args->{file}) || die;
    binmode IN=>":raw";
    local undef $/;
    my $data = readline(IN);
    $data =~ s!^\xFE\xFF!!;
    $data = Encode::decode(’utf-16’, $data);
    $data = Encode::encode(’utf8’, $data);
    return $data;
}

詳細は上記サイト参照。

ここではやってることの説明だけ。ちゃんと理解してるわけでなく、結果オーライでやってるので間違ってる可能性があるけど。


・入力はバイナリモードで読み込む必要がある。

・ファイル全部一気読みのために、入力レコードのセパレーターを殺す。

・データの頭のBOMを削除

・utf-16でデコード(スクリプトで処理するため)


perlの内部形式にデコードしてしまえば、あとはそのまま処理してもいいだろうし、他の文字コードにエンコードしてもいいし。

ここから先はいつも通り、となる。


…にしても、どうしてutf16なんてものがあるんだろう。

(perlで扱いにくいってだけなのかもしれないけど)スゲーめんどくさい。

image
<<2026/3>>
       
1234567
891011121314
15161718192021
22232425262728
293031

【最近の10件】

日常読書映画アニメゲーム健康料理グルメカメラ写真ネタ仕事パソコンインターネットperlEPUB3電子書籍ActivityPub還暦生活
検索: