トップへ
田村研究室

マルチメディア論および演習

2009年度

2009
4/20

日本語文字コードの種類と変換

文字コードシステムとは

文字セットとは

アルファベットとわずかな記号だけを対象としたASCIIコードでは,全文字数が128個だけであり,0番の文字コードから127番の文字コードが用意されている.これを2進数で表現すれば0000000(B)番から1111111(B)番の文字コードとなり,つまり7ビット(7桁)の2進数の範囲内に納まる.通常は,コンピュータにおいて切りのよい1バイト(=8ビット)として1文字分の文字コードを表現する桁数としている.これから,アルファベットなど1バイトで表現できる文字のことを,「1バイトコード」と呼ぶ.

これに対して,日本語で扱う漢字は大量にある.少なくとも,2バイト(=16ビット)で表現できる0番から65535番までは必要である.無制限にすべての漢字をコード化することは非効率であるため,よく利用される漢字だけをコードにすることが行われてきた.この文字集合のことを「文字セット」と呼ぶ.詳しくは後述する日本語文字コードは,2バイト分(=65536個)の文字セットから構成されてきた.これから「2バイトコード」とも呼ばれた.さらには世界の言語の中には,一文字が3バイト以上の文字セットを必要とする文字コードも考えられることから,非西欧文字は一般には「マルチバイトコード」と呼ばれている.

符号化システムの必要性

ここで,アルファベット文字を含んだ日本語文章のような,1バイトコードと2バイトコードが混在する状況を考えてみよう.例えば次のような3バイトのデータがあったとする.

						00000000 00001111 10100101 
						

これは,(1) 1バイトコード3文字のデータ,かもしれないし,あるいは次のように,

						0000000000001111 10100101 
						

(2) 最初の2バイトが2バイトコードの一文字分+1バイトの1文字,なのかもしれない.あるいは

						00000000 0000111110100101 
						

(3) 最初の1バイトが1バイトコード1文字で,残りが2バイトコードなのかもしれない.このように,たった3バイトのデータでも複数の解釈が成り立つことになる.

このためマルチバイトを考慮した文字コードでは,データの各1バイトが,1バイトコードなのか,2バイトコードの最初のバイトか,2番目のバイトなのかなどを区別するためのなんらかの仕掛けが必要とされる.

この,区別するための仕掛けを考慮した,ある文字をどのようにコード番号を割り当てるかの符号化方法のことを「符号化システム」と呼ぶ.

日本語対応の文字コードシステムの種類

日本語で従来から使用されているコードは,歴史的経緯もあり複数存在する.上記のとおり,文字コードシステムは,日本語の文字を表現するための文字セットとそれをどのように符号化するかの符号化システムから構成される.以下にその説明を記述する.

日本語文字セットの種類

コンピュータで扱う文字を規定し,日常的に良く使われる文字を中心にどの漢字・記号などをコードに含めるかを定めたものが文字セットである.日本語の文字セットとしては大きく次の種類がある.

※この部分は,常磐繁著「マルチメディアデータ入門」コロナ社(2003)を参考にした.
  1. ASCII/JISローマ字 (JIS X 0201の数字・アルファベット・記号部分)
  2. JIS X 0201片仮名文字セット (JIS X 0201の半角カナ文字部分)
  3. JIS漢字(JIS X 0208-1997, 第一水準・第二水準漢字・数字記号類含む)
  4. JIS補助漢字(JIS X 0212-1990, 情報交換用漢字符号)
  5. 新JIS拡張漢字(JIS X 0213-2000)
  6. ユニコード(ISO 10646)

現代の日本語文章では,アルファベット文字も含まれなければならない.そこで日本語文字セットの中にもASCIIコードを含む.ASCIIコードは先に説明したとおりアルファベットを決めるためのもので,各国語の都合に合わせてよいことになっている.日本語用のものがJISローマ字である.

JIS X 0201のうちカタカナ文字部分のことは,俗に半角カナ文字と呼ばれていた.昔のコンピュータのディスプレイは表示可能な文字数が少なかった.このため,横方向だけが漢字の半分の大きさの文字として表示された文字が用意されのことを半角文字と呼称した.(それに対して通常の漢字・記号などを全角と呼んだ.)現在では利用する意味はないものの,パソコンに比べて画面解像度の小さい携帯電話ではいまだに使用されることがある.

JIS漢字は,漢字だけでなくひらがな,(全角の)カタカナなど日本語表記文字と,さらに全角の数字やアルファベット記号やギリシャ文字なども含む文字セットである.大きくは,「一般日本語表記用」の第一水準と,「地名・人名を含む個別分野用」の第二水準の2グループに分けられている.

JIS補助漢字は,一般的な漢字だけでなく住民票・戸籍など固有名詞に必要な漢字のための文字セットとして制定された.

新JIS拡張漢字は,補助漢字が論理的に検討されて選定されていなかったため,補助漢字とは別に新たに選定されたものである.

ユニコードは,全世界共通の国際統一コードを目指して,各国語の文字セットをまとめてひとつの大きな文字セットを作成したものである.

日本語の符号化方法の種類

日本語を含む文字セットを符号化する方式には次のようなものがある.単純に文字コードと呼んだ場合,この符号化方式のことだけを指す場合もある.

  • ISO-2022JP(JISコード)
  • ShiftJISコード(≠CP932)
  • EUC-JP
  • ユニコード(UCS-2,UCS-4,UTF-8,UTF-16)

ISO-2022-JP(JISコード)

俗にJISコードと呼ばれる.インターネットの初期から電子メールなどに使われてきた日本語コード方式である.

日本語表記に必要な複数の文字セットとしてASCII/JISローマ字・JIS漢字に対応し,これらを文章中で切替えながら使用する.

JIS漢字は2バイトで表現されるコードであるが,1バイト目,2バイト目を単独で読み込んだ場合に,ASCIIコードと区別がつかない.このため,使用する文字セットをどうにかして区別するための「印」を挿入することを考えられた.印として「エスケープシーケンス」を用いる.

実際に文字セットの切替えには,次のエスケープシーケンスが用いられる.それぞれ対応する文字セットとエスケープシーケンスの16進数コードとそれをASCIIで表示してある.それぞれの文字セットに切替えるとき,文章中にこのエスケープシーケンスを挿入する.エスケープシーケンスとは,テキストの文字以外を表す制御文字の並びのことで,この場合文字セットの切替え制御に用いられているわけである.

(1) ASCII          「1B 28 42」^[(B
(2) JISローマ字    「1B 28 4A」^[(J
(3) JIS X 0208-1978「1B 28 40」^[$@
(4) JIS X 0208-1983「1B 28 42」^[$B 
						

各文字セットの一文字が16進数で21〜7Eまでの範囲で表現される.JIS漢字の場合にも21〜7Eまでの範囲のコードふたつを組み合わせて(1バイト目と2バイト目)表現される.この範囲を二進数として表現しなおすと,00000010〜01111110,となり,先頭が必ず0であり,実際は7bitで表現可能である.特に欧米のコンピュータでは,文字データの通信に7bitしか伝送できないものが過去に多く見受けられたため,そのような欧米のコンピュータを経由してもちゃんと通信できるように,JISコードでは7bitで表現できるように考慮されていた.

JISコードの約束事として,行頭では必ずASCIIが用いられること.このため最初のASCII用のエスケープシーケンスは必要ない.また改行するときには,必ずASCIIコード(またはJISローマ字)に戻しておかないといけない.

ISO-2022-JPの欠点は,文字セットの切替えのたびにエスケープシーケンスが必要となるため,その分文章とは関係ないデータ量が必要となる点と,必ず先頭から順にデータを読まないと,ある文字データがどの文字セットのものかどうか判断できない点にある.後者のおかげで,途中からデータを読み込めなかったり,途中のデータを編集する際に面倒な処理が必要となり,コンピュータの内部データとしてはあまり適していない.このため,あくまで先頭から一回だけデータを読み込めばいい通信用データとしてだけ用いられることが多い.

ShiftJISコード

昔のパソコンで広く使用されてきた文字コードで,windowsの(その以前のMS-DOSでも)内部用のコードとして使用されてきた.windowsで文字データだけのテキストファイルを保存すると,この文字コードで保存されてきた.Microsoftが開発し,事実上の標準としてJISでも「シフト符号化表現」として取り込まれた.「SJIS」「MSコード」などとも呼ばれる.

対応する文字セットは,上記ISO-2022-JPと同様に,ASCII/JISローマ字・JIS漢字に対応するが,さらにJIS X0201片仮名文字セットにも対応している.ISO-2022-JPのようなエスケープシーケンスを使用せずに,この3種の文字セットを全部区別するため,文字セット別に使用する範囲を分けてしまうというアイデアである.このため,特にJIS漢字コードの第1バイト目のコードを,(2)と区別できるよう に,本来なら連続している番号なのにA0からDFの範囲を使用しないようにその部分をシフト(ずらす)させるというかなり強引な手法を採用している.これが「シフト」の意味である.また,通信用に用いる

(1) ASCII/JISローマ字 21〜7E  (先頭のビットが0)
(2) JIS X0201片仮名  A0〜DF  (先頭のビットが1)
(3) JIS X 208(JIS漢字)
    第1バイト 81〜9FとE0からEF (A0〜DFを避ける)
    第2バイト 40〜7Eと80からFC
						

EUC-JP(日本語EUC)

Extended Unix codeの略.主としてUNIX系OSで使用されてきた.元々は汎用的な仕組であるため,日本語以外でも中国語(EUC-CN)や韓国語(EUC-KR)などでも使用されている.

EUC-JPでもShiftJIS同様に,ISO-2022-JPのようなエスケープシーケンスは使用せずに,文字セットを切替える.使用できる文字セットは次の4種類で,EUC独自の呼称としてコードセットと呼ばれる.

(コードセット0) ASCII			20〜7E
(コードセット1) JIS X 0208-1990(JIS漢字)
	第一バイト	A1〜FE
	第二バイト	A1〜FE
(コードセット2) JIS X 0201 片仮名
	第一バイト	8E
	第二バイト	A1〜FE
(コードセット3) JIS X 0212-1990(JIS補助漢字)
	第一バイト	8F
	第二バイト	A1〜FE
	第三バイト	A1〜FE
						

ASCIIとそのほかの日本語文字の区別は,先頭のビットが0か1かで判断される.先頭が1のとき,通常はJIS漢字文字セットが使用され,それ以外のときには第一バイト目の制御文字で8Eか8Fかで,片仮名か補助漢字か区別される.この8Eと8Fはエスケープシーケンスではなく,次の一文字が特定の文字セットであることを示す制御文字であり,例え片仮名が連続していても一文字一文字ごとに8Eが必要とされる.このため片仮名一文字を表現するには2バイト,補助漢字を表現するには3バイト必要となっている.

UNIコード

そのほかの符号化方式と異なり,文字セットとして全世界共通のただひとつのユニコードを使用すると考えれば,複数の文字セットを切替える必要はなくなるため,単純に表現したい文字数に従った符号化方式を用意すればよいので,話が単純となる.現時点で用意されている符号化方式として次の2つが存在する.

  • UCS-2 (16bit)
  • UCS-4 (32bit)

UCSはUniversal Character Setの略で,文字セットとして捉えられることもあるが,16ビット/32ビットで文字を符号化する方式を規定している(そもそもUCS-4では当初具体的に格納する字体が決められていなかった).UCS-2はUCS-4の一部と捉えることもできる.

ユニコード以外でも漢字を表現するのに2バイトを使用していたが,これらはあくまで1バイト単位で第一バイト,第二バイトのように処理されていた.しかしこのユニコードでは16ビット表現として考えれているため,バイトオーダ(エンディアン)の問題に注意が必要である.この問題は,使用するCPUの種別によって,16ビットの数を表現するのに上位下位のバイトの並び方が異なることに起因する.特に,ファイルに保存したデータを別の機種で読み込もうとしたときに,問題が露見することになる.

そこで,伝送用の符号変換方式が定められ,実際の通信データやファイル保存にはこの方式で変換されたデータが用いられることになっている.

  • UTF-7 UCS-2を,7bitに変換( 基本的にはUTF-16をBase64変換したようなもの,もはや推奨されず)
  • UTF-8 UCS-2/UCS-4を,8bitデータの可変長バイト列に変換
  • UTF-16 UCS-2内の符号ふたつを組み合わせる(サロゲートペア)ことでUCS-2を拡張する方式,16bitデータの可変長バイト列に変換

ユニコードの中では,UTF-8が現在よく用いられる.UTF-16ではやはりバイトオーダの問題が生じるため,BOM(バイトオーダマークを文章の先頭に埋め込む必要がある.