Shift_JIS(cp932) の文字コードで、2byte目が0x5c のエスケープ文字 \ になっているものの俗称(だめ文字、駄目文字) エスケープ文字は使用するフォントやロケールにより¥記号またはバックスラッシュで表示されます。 ダメ文字には ー ソ 十 表 など、使用頻度の高いものもあるので cp932を扱う場合には注意する必要があります。 広義には2byte目が 0x7c のパイプ文字 | になっている文字や、2byte目が正規表現などのメタ文字と重なる文字も含む場合もあります。 ダメ文字問題は正規表現をはじめとする様々な言語、システムで制御用のメタ文字として扱われる文字と同じバイト列が、SJISの漢字の2byte目に含まれていることにより起こります。 特に 0x5c や 0x7c は様々なシステムで制御文字として扱われるので、文字化けや検索出来ないなどの問題が起きる事があります。 たとえば cygwin/GNU grepでは「表現」のように cp932のダメ文字 "表" を含む文字列を、固定文字列(fgrep)では検索できますが、正規表現ではgrepできません。 ダメ文字を含む日本語を検索しているつもりなのに、grep側からは正規表現で検索しているとみなされてしまうためです。 「表現」の cp932でのバイト列は、 95 5c 8c bb です。
0x5c の¥記号はエスケープ文字なので 0x8c をエスケープして、 95 8c bb というバイト列を探す事になりますが、これは当然見つかりません。 2byte目が 0x5c のダメ文字については ¥記号を付加して(表 → 表\) 回避する対処方法もあります。 QFixGrepでは全てのダメ文字への対策として、適当な正規表現で置き換えてgrepしています。 これはSJIS固有の問題なので、utf-8等では関係ありません。 根本的な対策として、正規表現などが絡むファイルはutf-8等に変更するのが望ましいでしょう。 日本語版 Windowsのshellエンコードは cp932なので、ファイル名でも同じ問題が起きる事があります。 日本語対応していないソフトを日本語版 Windowsで使用する場合、できるだけ日本語ファイル名を使用しない方が問題は起きにくくなります。 余談ですが、 cp932 と Shift_JIS とは厳密に言うと ~ など一部の文字コードが異なります。 これはダメ文字問題ではないのですが、やはり気をつける必要があります。 また日本語版Windowsのshellの見かけ上は cp932(Shift-JIS) になっていますが、内部的にはunicode化されています。
|