#author("2016-07-03T00:05:37+09:00","default:kamigaki","kamigaki") ''文字コードに関すること'' //コメント #contents *文字コードとは [#z60d450b] 文字コードとは、コンピュータで文字データを扱うときに使用する、各文字に対して割り当てられた符号(コード)のことである。~ 例えば「あ」という文字は、明朝体や、ゴシック体など表示する図形の形は複数あっても「あ」という文字の持つ意味は1つである。~ このように各文字の意味にたいして符号(コード)を決めてしまえば、データ処理・データ交換を効率的に行うことができる。~ 文字コードはその規格ごとに、使用する文字の集合と、各文字に割り当てる符号(コード)が決められている。~ このページでは主に日本で使用される文字コードについて紹介する。 *符号化文字集合と、文字符号化方式 [#v23b61df] 文字コードとは、符号化文字集合と、文字符号化方式に分けて考えることができる。~ 符号化文字集合(以下「文字集合」という。)とは、使用する全ての文字の集合を定義し、各文字に符号番号を割り当てたものである。~ 狭義の文字コードとは文字集合のことであるが、後述する文字符号化方式と合わせて作られた文字コードもあり、完全に切り分けて考えることは難しい。~ 文字符号化方式とは、文字集合を元にして文字列データを表現するさいに、データ列として、どのように各文字を配置し、符号化するかを決めたものである。~ ASCIIのような単純な文字コードを単一で使用するときは、文字集合の各文字を1文字1バイトとして並べただけのものであるが、日本では、ASCII、JISなど、複数の文字集合を混在して使用するために符号位置を計算によりずらしたり、特殊な文字を使用して複数の文字集合を切り替えて使用するなど、様々な方式が使用されている。~ *ASCII [#v1094d34] 現在のコンピュータで使われる文字コードのもっとも基本となるコード。7ビット 128文字で構成される。~ American Standard Code for Information Interchange(アメリカ情報交換用標準的符号)の略。~ コンピュータが使われる以前からテレタイプと呼ばれる文字通信に使われていた。 制御文字(0x00〜0x1f, 0x7f)、空白(0x20)、図形文字(0x21〜0x7e)で構成される。 なぜ、制御文字の0x7f(DEL)だけ離れた位置にあるかというと、データを紙テープで保存していた当時、間違えて穴をあけてしまったときに、その箇所のすべてに穴を開けた状態にすることで(0x7f=1111111) その文字を削除できるようにしたため。 *ISO/IEC 646 [#c4863c2d] ASCIIは、アメリカで使われることを想定して作られたコードであるが、それを国際的に使えるようにISOが制定した規格。各国版のコードを作るための基本的な枠組。~ ASCII同様の7bitコードを基本として、その図形文字のうち10文字を各国で自由に決めていいものとした。~ さらに0x23は#(番号記号)か£(ポンド)のいずれか、0x24は$(ドル記号)か¤(不特定通貨記号)のいずれかを選ぶことになっています。 *ISO/IEC 2022 [#n82f4cbf] ISO(国際標準化機構)と国際電気標準会議(IEC)が定めた、複数の文字集合を切り替えて使用する文字符号化方式。具体的な文字集合については規程されていない。 ISO/IEC 646の枠組みをもとに、8ビットコードと2バイトコードが使用可能となった。~ また、複数の文字集合を切り替えて使用することが可能となった。 8bitの符号表は、ISO/IEC 646の7bitコードと同じ構造を持つ符号表を2枚使用し、第8bitを0とするCL, GL領域と、第8bitを1とするCR, GR領域を使用する。~ この各領域(8bit符号表)に文字集合を呼び出して使用する。また、7bitコードとして使用する場合はCL, GL領域のみを使用する。 符号表の領域に呼び出す文字集合は、あらかじめ4つのバッファ(G0, G1, G2, G3)に指定しておく。G0~G3バッファへの文字集合の指定は、エスケープシーケンスを用いて行う。~ 文字集合には 0x20(ASCIIのSPC), 0x7F(ASCIIのDEL)を使用する96文字集合と、それらを使用しない94文字集合がある。G0には96文字集合を使用することはできない。 この状態から、制御文字を用いて符号表の指定領域へ、指定のバッファを呼び出すことで文字集合を切り替える。(例:SI(シフトイン)でG0の文字集合をGLに呼び出し。) *JIS X 0201 [#bc44589a] 日本工業規格(JIS)の制定している文字コード規格。~ JIS X 0201では、ラテン文字集合と、カタカナ集合を定めている。~ ISO/IEC 646の日本版が、7ビット ラテン文字集合になる。 ラテン文字集合の、ASCIIからの変更は以下の2点。 -0x5cに、バックスラッシュ(\)にかわり、円記号(¥)が割り当てられた。 -0x7eに、チルダ(~)にかわり、オーバーライン( ̄)が割り当てられた。 ただし、送信者と受信者との間で明示的な合意がある場合は、オーバーライン( ̄)は、チルダ(~)と同じ字形を使用してもよい。この場合でも、文字の名称はオーバーラインでなければならない。 カタカナ集合は、いわゆる半角カタカナといわれるもの(規格上は半角幅で表示する必要はない。)。~ カタカナ集合の8bit目を1にして8bitコードとして使用するか、7bitコードとしてラテン文字集合とカタカナ集合を切り替えて使用する。(制御コード SI, SOで切り替える。) *JIS X 0208 [#c051feb7] 日本工業規格(JIS)の制定している文字コード規格。~ ISO/IEC 2022の2バイト符号化文字集合に準拠した構造を持つ、日本版の文字集合。 JIS X 0201では表現できない日本語のひらがな/漢字などを収録している。~ 英数字/カタカナ/記号など JIS X 0201に収録されている文字も収録してあり、JIS X 0208単独で文字コードとして使用することも想定している。(漢字用7ビット符号というJIS X 0208のみを使用した符号化表現が存在する。) しかし、一般的に使われる符号化方式(例えばShift_JIS)では、JIS X 0201, JIS X 0208を混在して使用するために、同一の文字にたいして、複数の符号位置が与えられる重複符号化の問題がある。これが俗にいう半角/全角文字の違いである。実際にはJIS X 0201, JIS X 0208ともに文字の幅についての規定はないため、半角/全角という呼び方は不適当であるが、日本では定着した読み方になっており、Unicodeの文字名称にも HALFWIDTH、 FULLWIDTHという名称が使われている。 97JISの「シフト符号化表現」の規定においては、以下の規則を原則として適用することにしています。 -JIS X 0201 ラテン文字と, JIS X 0208の両方にある文字は、JIS X 0201のほうのコード値を使用。 -JIS X 0201 片仮名と, JIS X 0208の両方にある文字は、JIS X 0208のほうのコード値を使用。 JIS X 0208 附属書1(規定) シフト符号化表現(いわゆるShift_JISのこと)においては、以下のような記載があります。 -JIS X 0201 の片仮名用図形文字は原則として使用しない。 -JIS X 0208 の英数記号文字(JIS X 0201のラテン文字集合と重複する文字)は原則として使用しない。 ただし、これまでの慣用的な利用との互換を目的としてだけ、これらの文字を使用してもよい。 よってこれから作成するテキストでは、俗にいう全角英数字と、半角カナは使わないことが推奨されます。~ ただし円記号¥は、\(バックスラッシュ)との誤表示を防ぐために、JIS X 0208(全角文字)を使うのもやむを得ずという見解もあります。 **機種依存文字 [#pce19ccb] JIS X 0208の文字コード表には、文字が割り当てられていない区点位置があり(空き領域)に、そこにベンダが独自に文字を定義したもの。~ Windowsで使われる、機種依存文字を追加したShift_JISは、CP932, MS932, Windows-31Jといった名称で呼ばれる。同様に旧Mac OSの、MacJapaneseがある。 *JIS X 0212 [#t53c757c] JIS X 0208に足りない文字を補うための2バイト符号化文字集合。主に補助漢字を収録している。JIS X 0208と組み合わせて使用するように設計しているため、JIS X 0208に収録されている文字は含まない。よって文字集合を切り替えられないShift_JISでは使用できない。EUC-JPで使用できるほか、ISO-2022-JPに、JIS X 0212を含めた符号化方式としてISO-2022-JP-1(RFC2237)がある。 *JIS X 0213 [#t75d50c6] JIS X 0208に足りない文字を補うための符号化文字集合。JIS X 0212とは違い、JIS X 0208を拡張するかたちで実装された(JIS X 0208の文字集合を含む。)。~ Shift_JIS-2004, ISO-2022-JP-2004, EUC-JIS-2004のような符号化表現にて使用することができる。 *Shift_JIS [#e0238db9] 現在日本でもっとも使われる文字コード。ISO/IEC 2022には準拠していない。~ JIS X 0201 と JIS X 0208 の文字集合を混在して使用する文字符号化方式。~ JIS X 0201(いわゆる半角文字)は1バイトで表現し、JIS X 0208(いわゆる全角文字)は2バイトで表現する。 **0x5c問題 [#b0998cd7] Shift_JISでは、JIS X 0208を2バイトで表現するさいに、2バイト目に ASCIIの\(0x5c)を含むことがある。~ \(0x5c)はプログラムでは特殊な意味を持つ文字として使用されることが多い。例えばC言語やPerlなどは、"\n"と記述して改行を意味するなど、文字列中に制御文字を埋め込むフラグとして使用している。~ Shift_JISを想定しない英語圏のソフトなどでは、文字列の先頭から1バイトずつ探索したさいに、\(0x5c)を特殊文字へのフラグとして受け取ってしまう。~ 2バイト目に\(0x5c)を持つ文字一覧 ― ソ Ы Ⅸ 噂 浬 欺 圭 構 蚕 十 申 曾 箪 貼 能 表 暴 予 禄 兔 喀 媾 彌 拿 杤 歃 濬 畚 秉 綵 臀 藹 觸 軆 鐔 饅 鷭 偆 砡 纊 犾 *ISO-2022-JP [#r5c66f4a] ISO/IEC 2022 準拠の日本語文字符号化方式。7bitコード。俗にいうJISコード。~ 日本の電子メールで標準的に使用されている。 ISO/IEC 2022の方式に基づき、以下の文字集合を、エスケープシーケンスで切り替えて使用する。ISO-2022-JPでは7bitコードであるためCR, GR領域は使用しない。また使用するバッファはG0バッファのみのため、符号表のGL領域は常にG0バッファを参照している状態で固定されている。よって文字集合の切り替えは G0バッファに対してのみ行われる。 |文字集合|エスケープシーケンス| |ASCII|ESC(B| |JIS X 0201 (ラテン文字集合)|ESC(J| |JIS X 0208-1978|ESC$@| |JIS X 0208-1983|ESC$B| JIS X 0201で使用できるのははラテン文字集合のみで、カタカナは使えないことに注意。(いわゆる半角カナ)~ 新たに文字集合を追加した派生規格もある。(ISO-2022-JP-1,ISO-2022-JP-2,ISO-2022-JP-3,ISO-2022-JP-2004) *EUC-JP (Extended Unix Code) [#vadcd595] ISO/IEC 2022 準拠の日本語文字符号化方式。8bitコード。主にUnix系OSで広く使われている。(最近はUnicodeに置き換わっている。)~ EUC-JPの符号表は、ISO/IEC 2022の構造に準拠しており、以下のバッファの文字集合を使用する。各バッファの文字集合は固定されており、ISO-2022-JPのようにバッファの文字集合を切り替えることはない。 |ISO 2022 バッファ|文字集合| |G0|ASCII| |G1|JIS X 0208-1997| |G2|JIS X 0201(カタカナ集合)| |G3|JIS X 0212-1990(補助漢字)| 符号表は、GL領域をG0バッファのASCIIに固定。GR領域は初期状態でG1バッファのJIS X 0208になっています。~ GR領域は、制御文字SS2(0x8e)によりG2バッファのJIS X 0201に、SS3(0x8f)によりG3バッファのJIS X 0212に切り替えて使用できます。~ SS2, SS3はシングルシフトと呼ばれ、直後1文字のみ符号表を切り替えることができます。 JIS X 0201カナは、SS2と組み合わせて2バイトが必要。 JIS X 0212は、SS3と組み合わせて3バイトが必要となります。 *Unicode(ISO/IEC 10646, JIS X 0221) [#f205c2e0] 世界中で使われる全ての文字を1つの文字集合で表現することを目標に作られた文字コード。~ Unicodeと、ISO/IEC 10646は、元々は別の規格であったが、後に同一の内容に統一されている。~ 過去の日本の文字集合(JIS X 0208等)とは互換性がないため、文字コードを相互変換するときは、各文字ごとに対応表を使用しなければいけない。~ **ハンユニフィケーション [#ldf3e71f] Unicodeでは、世界中の文字を1つの文字集合で表現することを目標に開発された。~ その過程で、中国語、日本語、朝鮮語等の東アジア圏で使用される漢字のうち、由来が同一で、字体が同一または類似する文字が、1つの文字符号に統合された。~ 統合された漢字のことを、CJK統合漢字という。~ 字体の微妙に異なる文字を多く統合したため、言語環境によって表示する字体が異なるという問題がある。 *UCS-2 [#m5c36501] Unicodeの符号化文字集合の1つ。1文字2オクティット(16bit)で表現される。~ 元々Unicodeは、1文字16bitの固定長コードで作成する予定であったが、後にそれでは収まらないことが分かり1文字4オクティットのUCS-4に拡張された。~ UCS-2は拡張される前の16bitの範囲だけに限定したUCS-4のサブセットである。将来的には廃止される予定である。 *UCS-4 [#a83fd319] Unicodeの符号化文字集合の1つ。1文字4オクティット(32bit)で表現される。~ 文字を扱う範囲は、U+0000 - U+10FFFF までと定義されている。 *UTF-8 [#b07cdd44] Unicodeの文字符号化方式の1つ。~ Unicodeの文字を、その文字の種類によって、1~4バイトで符号化する。~ 2バイト以上で符号化するときには、ビット演算により、Unicodeの符号を各バイトの決められたビットに配置する。~ ASCIIコードのみを使用した場合、1文字1バイトでUTF-8とASCIIは全く同じコードになる。 日本語のひらがな・漢字などは1文字に3バイトが必要でUTF-16よりもデータ量は大きくなる。~ 現在、主にデータ保存・交換用の文字コードとして、広く使用されている。 *UTF-16 [#jd0fd969] Unicodeの文字符号化方式の1つ。~ UCS-2のデータ範囲(U+0000 - U+D7FF, U+E000 - U+FFFF)は、1文字を2バイトとして符号化する。~ その他のUCS-4のデータ範囲(U+10000 - U+10FFFF)は、サロゲートペアにより1文字を4バイト(2バイト×2)として符号化する。~ 現在では、主にコンピュータのメモリ上に配置する内部データ記憶方式として使われている。~ 例えば、Windowsの内部コードや、Javaの内部文字コードとして使用されている。 **サロゲートペア [#a98990ed] UCS-2に収まらないUCS-4のデータ範囲(U+10000 - U+10FFFF)を表現するために、UCS-2の上位サロゲート文字(U+D800 - U+DBFF)と下位サロゲート文字(U+DC00 - U+DFFF)を組み合わせて配置し、それぞれのサロゲート範囲に符号を分割して配置する。このサロゲート文字の組み合わせをサロゲートペアという。~ 当初のUnicodeは、全ての文字集合が2バイト(UCS-2)に収まる予定であったため、UTF-16は1文字2バイトの固定長方式になるはずだったが、後にサロゲートペアが追加された結果、1文字の大きさが可変長の符号化方式となった。また、サロゲートペアを使用してもUCS-4で扱える符号範囲が、U+0000 - U+10FFFF に制限されるため、後にUCS-4のデータ範囲も、同範囲に制限されることになった。~ *UTF-32 [#vbee867a] Unicodeの文字符号化方式の1つ。~ UCS-4の符号化文字集合を、1文字を4バイトの固定長として表現したもの。~ UTF-16と違い、1文字が完全に固定長でデータの取扱いは最もやりやすいが、データ量の無駄は大きい。~ UTF-16と同じく内部データ記憶方式として使用されている。