fudist

Shift_JIS(cp932)の「ダメ文字」


QFixGrep - vim用grepヘルパー | QFixGrep - インストール | QFixGrep - 使い方と操作一覧 | QFixGrep - オプション | Shift_JIS(cp932)の「ダメ文字」トラブルシューティング

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化されています。


 2byte目が0x5c \ のダメ文字
 ーソЫⅨ噂浬欺圭構蚕十申曾箪貼能表暴予禄兔喀媾彌拿杤歃濬畚秉綵臀藹觸軆鐔饅鷭偆砡纊犾

 2byte目が0x7c | のダメ文字
 -ポл榎掛弓芸鋼旨楯酢掃竹倒培怖翻慾處嘶斈忿掟桍毫烟痞窩縹艚蛞諫轎閖驂黥埈蒴僴礰

 ほぼ全てのダメ文字

 2byte目が下記のASCII文字
 @ [ \ ] ^ _ ` { | } ~


 ダメ文字の種類別に表にまとめてあります。
 「ダメ文字一覧表

ー,―,‐,/,\,+,±,×,A,ァ,ゼ,ソ,ゾ,タ,ダ,チ,ボ,ポ,マ,ミ,А,Ъ,Ы,Ь,Э,Ю,Я,к,л,м,н,院,閏,噂,云,運,雲,荏,閲,榎,厭,円,魁,骸,浬,馨,蛙,垣,柿,顎,掛,笠,樫,機,擬,欺,犠,疑,祇,義,宮,弓,急,救,掘,啓,圭,珪,型,契,形,鶏,芸,迎,鯨,后,梗,構,江,洪,浩,港,砿,鋼,閤,降,察,纂,蚕,讃,賛,酸,餐,施,旨,枝,止,宗,充,十,従,戎,柔,汁,旬,楯,殉,淳,拭,深,申,疹,真,神,秦,須,酢,図,厨,繊,措,曾,曽,楚,狙,疏,捜,掃,挿,掻,叩,端,箪,綻,耽,胆,蛋,畜,竹,筑,蓄,邸,甜,貼,転,顛,点,伝,怒,倒,党,冬,如,納,能,脳,膿,農,覗,倍,培,媒,梅,鼻,票,表,評,豹,廟,描,府,怖,扶,敷,法,房,暴,望,某,棒,冒,本,翻,凡,盆,諭,夕,予,余,与,誉,輿,養,慾,抑,欲,蓮,麓,禄,肋,録,論,倭,僉,兌,兔,兢,竸,兩,兪,几,處,凩,凭,咫,喙,喀,咯,喊,喟,啻,嘴,嘶,嘲,嘸,奸,媼,媾,嫋,嫂,媽,嫣,學,斈,孺,宀,廖,彈,彌,彎,弯,彑,彖,悳,忿,怡,恠,戞,拏,拿,拆,擔,拈,拜,掉,掟,掵,捫,曄,杣,杤,枉,杰,枩,杼,桀,桍,栲,桎,檗,歇,歃,歉,歐,歙,歔,毬,毫,毳,毯,漾,濕,濬,濔,濘,濱,濮,炮,烟,烋,烝,瓠,畆,畚,畩,畤,畧,畫,痣,痞,痾,痿,磧,禺,秉,秕,秧,秬,秡,窖,窩,竈,窰,紂,綣,綵,緇,綽,綫,總,縵,縹,繃,縷,隋,膽,臀,臂,膺,臉,臍,艝,艚,艟,艤,蕁,藜,藹,蘊,蘓,蘋,藾,蛔,蛞,蛩,蛬,襦,觴,觸,訃,訖,訐,訌,諚,諫,諳,諧,蹇,躰,軆,躱,躾,軅,軈,轆,轎,轗,轜,錙,鐚,鐔,鐓,鐃,鐇,鐐,閔,閖,閘,閙,顱,饉,饅,饐,饋,饑,饒,驅,驂,驀,驃,鵝,鷦,鷭,鷯,鷽,鸚,鸛,黠,黥,黨,黯,纊,倞,偆,偰,偂,傔,垬,埈,埇,犾,劯,砡,硎,硤,硺,葈,蒴,蕓,蕙



QFixGrep - vim用grepヘルパー | QFixGrep - インストール | QFixGrep - 使い方と操作一覧 | QFixGrep - オプション | Shift_JIS(cp932)の「ダメ文字」トラブルシューティング
サブページ (1):