改変スクリプト

Shift_JISのダメ文字


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していますが、日本語の検索に関して言えば可能な限り正規表現を使用しない fgrep(固定文字列検索)を使用するべきです。

「ダメ文字」はSJIS固有の問題なので、utf-8等では関係ありません。
根本的な対策として、正規表現などが絡むファイルはutf-8等に変更するのが望ましいでしょう。
日本語版 Windowsのshellエンコーディングは(見かけ上) cp932なので、ファイル名でも同じ問題が起きる事があります。
このため日本語対応していないソフトを日本語版 Windowsで使用する場合、できるだけ日本語ファイル名を使用しない方が問題は起きにくくなります。
なお日本語版Windowsのshellの見かけ上は互換性のため cp932(Shift_JIS) になっていますが、内部的にはunicode化されています。

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

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

 ほぼ全てのダメ文字

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


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

以下は一部抜粋で全てではありません。

ー,―,‐,/,\,+,±,×,A,ァ,ゼ,ソ,ゾ,タ,ダ,チ,ボ,ポ,マ,ミ,А,Ъ,Ы,Ь,Э,Ю,Я,к,л,м,н,院,閏,噂,云,運, 雲,荏,閲,榎,厭,円,魁,骸,浬,馨,蛙,垣,柿,顎,掛,笠,樫,機,擬,欺,犠,疑,祇,義,宮,弓,急,救,掘,啓,圭,珪,型,契,形,鶏, 芸,迎,鯨,后,梗,構,江,洪,浩,港,砿,鋼,閤,降,察,纂,蚕,讃,賛,酸,餐,施,旨,枝,止,宗,充,十,従,戎,柔,汁,旬,楯,殉,淳, 拭,深,申,疹,真,神,秦,須,酢,図,厨,繊,措,曾,曽,楚,狙,疏,捜,掃,挿,掻,叩,端,箪,綻,耽,胆,蛋,畜,竹,筑,蓄,邸,甜,貼, 転,顛,点,伝,怒,倒,党,冬,如,納,能,脳,膿,農,覗,倍,培,媒,梅,鼻,票,表,評,豹,廟,描,府,怖,扶,敷,法,房,暴,望,某,棒, 冒,本,翻,凡,盆,諭,夕,予,余,与,誉,輿,養,慾,抑,欲,蓮,麓,禄,肋,録,論,倭
など



余談ですが、 cp932(Microsoft定義のShift_JIS) と Shift_JIS とは厳密に言うと ~ など一部の文字コードが異なります。
これはダメ文字問題ではないのですが、やはり気をつける必要があります。(関連:「波ダッシュ」、「UTF-8→cp932変換表」)

cp932からunicodeへ変換した場合に異なる文字
cp932
Windows
Linux
 0x8160 U+FF5E U+301C
 0x8161 U+2225 U+2016
 0x817C U+FF0D U+2212
 0x8191 U+FFE0 ¢ U+00A2
 0x8192 U+FFE1 £ U+00A3
 0x81CA U+FFE2 ¬ U+00AC
0x815C U+2015 U+2014
(注意) Vista以降での0x815CはU+2014










サブページ (1): ダメ文字一覧表
Comments