!!!文字コード {{category 文字化け}} {{amazon 4774138959 }} *この本からのメモ *文字コードについての非常にわかりやすい解説があるため以下にメモ !!ワイド文字列とマルチバイト文字列 *ワイド文字列とマルチバイト文字列はC言語における用語 !マルチバイト文字列(multibyte character) *C言語の char には1バイトしか格納できないため、Shift-JIS なり EUC なり UTF-8と呼ばれる '''エンコーディング''' を利用して複数バイトで日本語の一文字を格納する。 ::問題点 *この方式だと、char 配列を最初から見ていかないとどこが文字の切れ目か判定できないという問題がある。 *文字列の検索を単なるバイト列の検索とすると、Shift_JISで「\」を検索すると「表」の2バイト目にマッチしたり、EUC-JPで「海」を検索すると「ここ」にマッチしたりする !ワイド文字列(wide character) *マルチバイトの問題点を踏まえ、日本語を含む十分なサイズの型で1文字を表現すればよいという発想 *C言語での wchar_t 型であり、この配列で文字列を表現したのが '''ワイド文字列''' ::C言語でのリテラル *ワイド文字 L'a' *ワイド文字列 L"abc" !!マルチバイト文字/ワイド文字変換関数 !メリットデメリット ,文字列,メリット,デメリット ,ワイド,文字の切れ目を走査して判定する必要あり,データサイズは小さくてよい ,マルチバイト,1文字のサイズが固定のため、プログラムから扱いやすい,1バイトで表現できる文字にも余分なサイズを消費してしまう *ファイルに書き込むときには、サイズの小さいワイド文字列で格納し、プログラム上(たとえばエディタ)ではマルチバイト文字列を使用すると都合がよいため、さまざまなマルチバイト、ワイド文字列変換関数が存在する。 !!Unicode *現状では、LinuxでもWindowsでも、ワイド文字として Unicode を利用することが多い !歴史 *Xeroxが提唱しUnicod Consortiumにより制定 *当初、世界のの文字を16ビットで表現するというコンセプトだったが、結局16ビットでは不足(現状21ビット) ::UCS2 *16ビットで収まる範囲の文字一式は UCS2(Universal Coded-Character Set の2バイト版) *[Javaで利用されるUnicodeはこれ|Java での文字コードの扱い] ::USC4 *USC2に収まりきらなかった文字を含め、すべてを4バイトで表現 !文字集合(character set) *コンピュータで文字を扱うために、対象とする文字をを決め、番号を振た文字の集合 *Unicodeの場合、文字にそれぞれ振られている番号をコードポイントと呼ぶ !エンコーディング(character encoding scheme) *文字コード(Unicodeではコードポイント)をメモリやディスク上にどのように表現するかは文字コードとは別の話でこの論理的な値を、バイトやビットにどう表現するのかを定めたものをエンコーディングと呼ぶ *Shift-JISとEUCは対象とする文字集合はどちらもほぼ同じ(JIS X0208)だが、メモリ上の表現形式が異なるため、異なるエンコーディングと位置づける !Unicode のエンコーディング ::UTF-16 *1文字当たり2バイト割り当てる *バイトオーダーにより、UTF-16BEとUTF-16LEの 2種類 ::UTF-8 *UTF-16では、アルファベットを表現するにも2バイト消費してしまう上、既存のASCIIコードとの互換性もないため、考えられた。 *ASCIIと同じ部分は1バイト(0x00 〜 0x7F)、その他の部分を2〜6バイトで符号化 **http://ja.wikipedia.org/wiki/UTF-8 !!機種依存文字 *[コンピュータによる情報の表現と処理|http://www.seiai.ed.jp/sys/text/cs/index.html] *[JIS X 0208と0213と機種依存文字|http://www.seiai.ed.jp/sys/text/cs/chp02/c02a050.html] !Cp932整理 *[ウィキペディア Microsoftコードページ932|http://ja.wikipedia.org/wiki/NEC%E9%81%B8%E5%AE%9AIBM%E6%8B%A1%E5%BC%B5%E6%96%87%E5%AD%97] に詳しい。 ::CP932 ,名称,内容 ,Windows-31J,Windows 3.1(J)のリリースに合わせて、マイクロソフトがJIS X 0208 に 機種依存文字(NEC特殊文字、NEC選定IBM拡張文字、IBM拡張文字)を統合して作られた文字コード ,MS932,Javaで、「IBMのコードページ932」と「Windows-31J」を区別する ,CP932,MS-DOSとWindowsにおける日本語コードページを表す。「Windows-31J」が制定されるまでは、OEMベンダによって文字集合が違う。 ,MS漢字コード,「CP932」とほぼ同じ意味。 ,OEMコードページ932,Windows 3.1日本語版の発売以前における、OEMベンダ各自の拡張を許した仕様の文字セット ::公的機関からも認められた文字符号化方式 ,名称,内容 ,シフトJIS,JIS X 0208符号化文字集合を一定の規則に従ってシフトした文字符号化方式。具体的な内容はJIS X 0208:1997に「シフト符号化表現」として記載がある。 ,Shift_JIS,「シフトJIS」のIANA登録名 ,SJIS,Shift_JISの短縮形。JavaではShift_JISと同義語 !CP932の誕生と発展 *CP932が、現在の「Windows-31J」の形として完成に至るまでには複雑な経緯がある。 *1982年(JIS X 0208-1983策定の前年)、JIS C 6226を複雑にシフトさせた文字符号化方式としてShift JISが誕生。 *Shift JISはマイクロソフトにより、MS-DOSにおける標準日本語コードとして採用「コードページ932(CP932)」という管理番号を与えられた。 *マイクロソフトはMS-DOSにおける唯一の日本語用コードページである「CP932」をOEMメーカーの自由に任せていた。 *NECのPC-9800シリーズ、IBMのPS/55シリーズ、富士通のFMRシリーズなどは全てMS-DOSを搭載しており文字符号化方式もShift_JISを採用しているが、登録されている文字集合がバラバラ ::OEMコードページの統合 *マイクロソフトは1993年、Windows3.1の日本語版を出すにあたり、「CP932」の仕様をOEMメーカーの自由に任せるという方針を撤回。 *日本のパーソナルコンピュータ市場で、特に大きなシェアを持つIBM、NEC2社の統合コードをWindowsにおける日本語標準コードとした *これをIANAに「Windows-31J」という名で登録 ::統合の概要 *ベースとなる符号化文字集合としてJIS X 0208-1990 *NECが9 - 13区に登録していた特殊文字の内、13区のものだけを継承。この13区登録の文字のことを「NEC特殊文字」と命名。 *NECが89 - 92区に登録していた漢字と非漢字は全て継承。このエリアの374文字のことを「NEC選定IBM拡張文字」と命名。 *IBMが115 - 119区に登録していた漢字と非漢字も全て継承。このエリアの388文字のことを「IBM拡張文字」と命名。 ::Windows-31Jに重複登録されたコード *統合の過程で重複する文字が登録されてしまっている。 *NEC選定IBM拡張文字とIBM拡張文字については、まるごと重複 *「¬」「∵」については三重複 ::文字コード変換時の重複文字の影響 *文字コード変換を行う際に、別の文字コードから、「Windows-31J」に変換する場合に、重複するどちらの文字へと変換するべきかが問題 !Java での文字コードの扱い *Java での文字コードの扱い