argius note

プログラミング関連

ライブラリを使わないマルチバイト文字操作

久しぶりにやったら混乱したのでメモ。
文字コード関連のライブラリを使わないで、マルチバイト文字を操作する場合の注意。例えば、SJISで書かれた以下のファイルがあるとき、

1と2と3
と4と5と

「と」を全て削除する場合、

while (<>) {
    s///g;
    print;
}
$ perl a.pl < sjis.txt
123
45
$

となりますが、ソースコードSJISでなければなりません。もし、ソースコードEUC-JPで書かれていると期待した動作になりません。
ソースコードEUC-JPで、データはSJISの場合は、

while (<>) {
    s/\x82\xC6//g;
    print;
}

のように、バイト値(SJIS「と」=0x82C6)を直接書けば、ソースコード文字コードに関わらず処理できます。