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なしに変換するサブルーチン

BLOCK_LTAG

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;

}

BLOCK_RTAG

詳細は上記サイト参照。

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


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

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

・データの頭のBOMを削除

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


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

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


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

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

image
<<2026/1>>
    123
45678910
11121314151617
18192021222324
25262728293031
検索:

【最近の20件】