1969年(昭和44年)、ISO R 646 を受け JIS C 6220(現・JIS X 0201)が制定された。いわゆる「半角カタカナ」を表示できる文字コード体系の誕生である。
JIS X 0201 制定
海外で文字コードの標準化が進む中で、日本も文字コードの標準化を進めていた。
1958年(昭和33年)に発足した通産省電気試験所(現・産業技術総合研究所)の「コード会」がそれである。この勉強会が中核となり、1960年(昭和35年)に情報処理学会が誕生する。 以後、日本語の文字コードは情報処理学会情報規格調査会で標準化が進められていく。
1969年(昭和44年)、ISO R 646 を受け JIS C 6220 が制定された。いわゆる「半角カタカナ」を表示できる文字コード体系の誕生である。
7単位(ビット)表と8単位表があるが、1970年代に入ってほとんどのコンピュータは8単位表を採用した。
その後、JIS C 6220は、情報処理部門(X)が独立したことに伴い JIS X 0201 と改称された。
1958年(昭和33年)に発足した通産省電気試験所(現・産業技術総合研究所)の「コード会」がそれである。この勉強会が中核となり、1960年(昭和35年)に情報処理学会が誕生する。 以後、日本語の文字コードは情報処理学会情報規格調査会で標準化が進められていく。
1969年(昭和44年)、ISO R 646 を受け JIS C 6220 が制定された。いわゆる「半角カタカナ」を表示できる文字コード体系の誕生である。
7単位(ビット)表と8単位表があるが、1970年代に入ってほとんどのコンピュータは8単位表を採用した。
その後、JIS C 6220は、情報処理部門(X)が独立したことに伴い JIS X 0201 と改称された。
JIS X 0201 コード表
JIS X 0201 表を以下に示す。白色の部分が「図形文字」、薄い黄色の部分は「制御文字」、グレーの部分は「未定義」である。
この表にあらわれる文字のことを「ANK」(Alphabet Numeric Katakana)と呼ぶ。
ISO 646 で各国に任されていた図形文字のうち、JIS X 0201 では、5Cの「\(バックスラッシュ)」を「¥(円マーク)」に、7Eの「~(チルダ)」を「 ̄(オーバーライン)」に割り当てた。
しかし、この5Cの割り当て変更は、その後に文字化けの大きな要因となってしまった。
この表にあらわれる文字のことを「ANK」(Alphabet Numeric Katakana)と呼ぶ。
ISO 646 で各国に任されていた図形文字のうち、JIS X 0201 では、5Cの「\(バックスラッシュ)」を「¥(円マーク)」に、7Eの「~(チルダ)」を「 ̄(オーバーライン)」に割り当てた。
しかし、この5Cの割り当て変更は、その後に文字化けの大きな要因となってしまった。
ISO 646 コード表
比較のために ISO 646 コード表を掲げる。
バックスラッシュと円マーク
じつは、我々が ASCII(ISO 646)コードと呼んでいるものの大部分は、JIS X 0201 のことである。
ASCIIとJIS X 0201の違いは、後者が半角カタカナを含んでいる点もそうだが、コード 5C のバックスラッシュ "/" が円マーク "¥" に置き換わっている点が大きい。(ここでは文字化けを防ぐため、両方とも全角文字で代用表記する。ちなみに、お隣の韓国ではウォン・マークに置き換わっているらしい)
この違いは、とくにプログラミングに関わる文字化けとして、今日まで影響を及ぼしている。UNIXのエスケープ文字としてバックスラッシュが使われてきたためである。
たとえば、文字検索でよく使われる正規表現では、バックスラッシュはエスケープ文字として機能する。また、C言語系のプログラミング言語ではprintfフォーマットで、やはりバックスラッシュがエスケープ文字として機能する。
これらを日本のパソコンで見ると、すべて円マークに置き換わってしまうのだ。
かつて、海外のコンピュータ書籍に書いてあるプログラムのソースコードにバックスラッシュがあるのに、どうやって入力したらよいか分からなくて苦労した方もいるのではないだろうか。翻訳本でもバックスラッシュのままのことが多かった。
ASCIIとJIS X 0201の違いは、後者が半角カタカナを含んでいる点もそうだが、コード 5C のバックスラッシュ "/" が円マーク "¥" に置き換わっている点が大きい。(ここでは文字化けを防ぐため、両方とも全角文字で代用表記する。ちなみに、お隣の韓国ではウォン・マークに置き換わっているらしい)
この違いは、とくにプログラミングに関わる文字化けとして、今日まで影響を及ぼしている。UNIXのエスケープ文字としてバックスラッシュが使われてきたためである。
たとえば、文字検索でよく使われる正規表現では、バックスラッシュはエスケープ文字として機能する。また、C言語系のプログラミング言語ではprintfフォーマットで、やはりバックスラッシュがエスケープ文字として機能する。
これらを日本のパソコンで見ると、すべて円マークに置き換わってしまうのだ。
かつて、海外のコンピュータ書籍に書いてあるプログラムのソースコードにバックスラッシュがあるのに、どうやって入力したらよいか分からなくて苦労した方もいるのではないだろうか。翻訳本でもバックスラッシュのままのことが多かった。
バックスラッシュとエスケープ文字
もう1つの問題は、シフトJIS(いずれ解説する)の一部にバックスラッシュと同じコードを含んでいる文字があることである。「表」「能」などが、それに当たる。
このため、日本語化を謳いながら、ファイル操作や正規表現、文字列操作で正常に動作しないプログラムが発生した。
インターネット時代を迎えた今日でも、この問題は引きずられている。
たとえば、PHP はシフトJISコードを含むマルチバイト文字を扱うことができる優れた言語だが、SQLを実行する際に文字化けを起こすことがある。
このため、日本語化を謳いながら、ファイル操作や正規表現、文字列操作で正常に動作しないプログラムが発生した。
インターネット時代を迎えた今日でも、この問題は引きずられている。
たとえば、PHP はシフトJISコードを含むマルチバイト文字を扱うことができる優れた言語だが、SQLを実行する際に文字化けを起こすことがある。
0001: $sql = "insert into mytable values ('機能')";
0002: $res = mysql_query($sql, $con);
上記のプログラムは、MySQLに文字列「機能」を新規登録するSQLクエリだが、これをシフトJISモードで実行すると文字化けを起こす。「能」はシフトJISコードで 945C だが、第2バイトの 5C がバックスラッシュと同じなので、mysql_queryを実行する際にエスケープ文字として認識され、文字化けを起こしてしまうのだ。
エスケープ文字を回避する
PHPで前述の問題を回避するためには、以下のように mysql_escape_string を用いる。 addslashes を使ってもよい。
0001: $str = mysql_escape_string("機能")
0002: $sql = "insert into mytable values ($str)";
0003: $res = mysql_query($sql, $con);
このほか、POSTで文字列を渡す時にもエスケープ文字が追加されるようだ。
こうしたエスケープ文字の問題があるため、インターネット業界ではEUC(いずれ解説する)を用いないプログラムを切り捨てる傾向があるが、WindowsではシフトJISが標準なので、そう簡単に割り切れるものでもないだろう。
こうしたエスケープ文字の問題があるため、インターネット業界ではEUC(いずれ解説する)を用いないプログラムを切り捨てる傾向があるが、WindowsではシフトJISが標準なので、そう簡単に割り切れるものでもないだろう。
エスケープ文字が含まれているかどうか調べる
最後に、与えられた文字列にエスケープ文字 5C が含まれているかどうか調べるツールを供する。適当な文字列を入力して試してみてほしい。たとえば「能力を表示する」では2カ所もエスケープ文字が含まれていることが分かる。
サンプル・プログラム
参考サイト
- JIS X 0201:日本工業標準調査会
- ASCIIコードと ISO 646:ぱふぅ家のホームページ
- コード表(ISO646,JISX0201,ISO8859等):ナマズのブログ
- 全角と半角:とつか町だより
(この項おわり)