文字列内にSJISの「0x5c」があると文字化けする

2バイト文字の中に0x5cがあると1バイト文字の「\」とみなされて不都合が起きる。
PHP で文字列を SJIS エンコードして、それをファイル名として ZIP に圧縮、という処理をしてたらファイル名がおかしくなったことで判明。

原因は SJIS の文字列に対して str_replace で \ を置換していたことだった。この処理をすると「表」という文字内の 0x5c も置換されてしまう。こういうのは EUCUTF-8 に一旦エンコードして、置換処理をしてから SJIS に戻す処理をする。これで不正な箇所の置換が行われずにすむ。


参考
http://www5f.biglobe.ne.jp/~fuku-labo/library/program/common/1/004.htm