見えざる敵BOM

2010年11月15日に持ち込まれた謎

Windowsperlを動かす。

  • aaa.pl(utf-8
    • use Encode;
    • use utf8;
    • use open IN => ":utf8";
    • binmode STDOUT, ":encoding(cp932)";
  • bbb.txt(utf-8
    • はじめまして。
    • はじめません。
    • はじらいます。
    • …みたいな日本語文がぞろぞろ入ってる。


aaa.plでbbb.txtを読み込み、配列@cccに格納。
@cccの中身を見てみよう。

print $ccc[0];
print $ccc[0];
print $ccc[1];

はじめまして。
?はじめまして。
はじめません。

むむむ…?
1行目の頭に何かくっついてる…?

print substr ($ccc[0], 0, 1);

"\x{feff}" does not map to cp932.
\x{feff}

やっぱり何かある!!

試行錯誤して一応解決

"\x{feff}"でぐぐってみた結果、utf-8のファイルの先頭にはBOM(Byte Order Mark)ってのがつくことがあるらしい。
utf-8NBOMなしってことを初めて知った。
今回初めてこの事件が起こったのは、Windowsのメモ帳で開いたのが原因かも。

TeraPadutf-8Nに変換したら解決した。

$ccc[0] = substr ($ccc[0], 1, length($ccc[0]));

↑みたいに強引にBOMをちぎってもうまくいってた気がする。