🍎🍏🍐 BOMを果実で可視化する
テキストファイルを扱うとき、BOM(Byte Order Mark)の存在が処理に影響することがあります。特にUTF-8/UTF-16の混在環境では、BOMの有無を明示的に扱うことで、より堅牢で詩的な処理が可能になります。
今回は、PerlでBOMを検出し、🍎🍏🍐の絵文字で可視化するサンプルを紹介します。
🍓 BOMと果実の対応表
"\xEF\xBB\xBF" => '🍎', # UTF-8 BOM
"\xFE\xFF" => '🍏', # UTF-16 BE BOM
"\xFF\xFE" => '🍐', # UTF-16 LE BOM
);
🥄 ステップ1:バイナリモードでBOMを取得
まずはファイルをバイナリモードで開き、先頭3バイトを読み取ってBOMを検出します。
open my $bin_fh, '<:raw', 'filename.txt' or die $!;
read($bin_fh, my $bom, 3);
if (exists $chege_BOM{$bom}) {
$bom = $chege_BOM{$bom};
} else {
$bom = '';
}
close $bin_fh;
🍵 ステップ2:テキストモードで再読み込みし、BOMを明示
UTF-8として再度ファイルを開き、最初の行にBOMを果実で添えて表示します。
open my $txt_fh, '<:encoding(UTF-8)', 'filename.txt' or die $!;
my $i = 0;
my $disp_bom = 1;
while (my $line = <$txt_fh>) {
if ($bom && $disp_bom && $i == 0){
$line = $bom . $line;
}
# ...ここで行を処理...
$i++;
}
close $txt_fh;
まとめ
###### BOM 明示の読み込み例 ######
my %chege_BOM = (
"\xEF\xBB\xBF" => '🍎', # UTF-8 BOM
"\xFE\xFF" => '🍏', # UTF-16 BE BOM
"\xFF\xFE" => '🍐', # UTF-16 LE BOM
);
# バイナリモードでBOM取得
open my $bin_fh, '<:raw', 'filename.txt' or die $!;
read($bin_fh, my $bom, 3);
if (exists $chege_BOM{$bom}) {
$bom = $chege_BOM{$bom};
} else {
$bom = '';
}
close $bin_fh;
# テキストモードで再度開く(UTF-8例)
open my $txt_fh, '<:encoding(UTF-8)', 'filename.txt' or die $!;
my $i = 0;
my $disp_bom = 1;
while (my $line = <$txt_fh>) {
if ($bom && $disp_bom && $i == 0){
$line = $bom . $line;
}
# ...処理...
$i++;
}
close $txt_fh;
🍇 おわりに
このように、BOMの存在を果実で可視化することで、処理の分岐やデバッグが直感的になります。特に複数の文字コードが混在する環境では、こうした「詩的な可視化」が密度ある記録と共鳴を生み出します。