Comments
Description
Transcript
文字コード
コンピュータ基礎演習� �ー文字と符号化ー� 岩井�儀雄� [email protected]� 文字の表現� コンピュータの中では文字は「ビット列」で表現� キーボード:押された文字に対応するビット列に変換� ディスプレイ:ビット列に対応する文字を表示� 符号化ー文字をビット列に割当� 例えば,� 'A' = 0100 0001 = 0x41� 'B' = 0100 0010 = 0x42� 'C' = 0100 0011 = 0x43� コード(割当ルール)→標準化� 文字コードの標準化� 文字コードの標準化を推進する団体� 日本:JSA� アメリカ:ANSI� Japan Standards Association, 日本規格協会� American National Standards Institute, 米国規格協会� 国際組織:ISO� International Standards Organization, 国際標準化機構� 文字コードの歴史� ASCIIコード制定� 1963年6月17日� 情報通信機器間の情報交換用符号� 32個の制御文字� 1個の空白文字� 94個の図形文字� 1個の削除文字� 32+1+94+1=128文字(7ビット)� ASCII コード表� 000 001 0000 NULL DLE 0001 SOH DC1 0010 STX 0011 011 100 101 110 111 0 @ P ` p ! 1 A Q a q DC2 " 2 B R b r ETX DC3 # 3 C S c s 0100 EOT DC4 $ 4 D T d t 0101 ENQ NAK % 5 E U e u 0110 ACK SYN & 6 F V f v 0111 BEL ETB ' 7 G W g w 1000 BS CAN ( 8 H X h x 1001 HT EM ) 9 I Y i y 1010 LF SUB * : J Z j z 1011 VT ESC + ; K [ k { 1100 FF FS , < L \ l | 1101 CR GS - = M ] m } 1110 SO RS . > N ^ n ~ 1111 SI US / ? O _ o DEL 制御文字領域 010 図形文字領域 ASCII コード表� 0 8 9 A B C D E F 0 NULL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US 1 2 3 0 4 1 2 3 4 5 6 7 ! " # $ % & ' ( ) * + , - . / 1 2 3 4 5 6 7 8 9 : ; < = > ? A B C D E F G H I J K L M N O 5 P Q R S T U V W X Y Z [ \ ] ^ _ 6 ` a b c d e f g h i j k l m n o 7 p q r s t u v w x y z { | } ~ DEL ISO 646� ISO により 1967年に規定� 世界共通の82文字のBCT (Basic Code Table)と国毎に変更可能な12箇所の NUP(National Use Position)の合計94 文字� ASCIIから一部を抜き出すことで制定� ASCII = ISO646 IRV� ISO 646� 0 8 9 A B C D E F 0 NULL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US 1 2 3 0 4 5 P 6 7 p 1 2 3 ! " 1 2 3 A B Q 4 5 6 7 % & ' ( ) * + , - . / 4 5 6 7 8 9 : ; < = > ? C D E F G H I J K L M N O R S T U V W X Y Z a b c d e f g h i j q r s t u v w x y z 国毎に自由に設定 _ k l m n o DEL ISO 8859� 8ビットの文字符号� ASCII文字94文字+96文字� ISO 8859-1 Latin Alphabet No. 1� アイスランド語,アイルランド語,イタリア語,英語,オラン ダ語,スウェーデン語,スペイン語,デンマーク語,ドイツ 語,ノルウェー語,ポルトガル語,フィンランド語,フェロー 語,フランス語� ISO 8859-2 Latin Alphabet No. 2� ISO 8859-10 まである.� ISO 8859-1 (ASCII互換部分)� 0 8 9 A B C D E F 0 NULL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US 1 2 3 0 4 1 2 3 4 5 6 7 ! " # $ % & ' ( ) * + , - . / 1 2 3 4 5 6 7 8 9 : ; < = > ? A B C D E F G H I J K L M N O 5 P Q R S T U V W X Y Z [ \ ] ^ _ 6 ` a b c d e f g h i j k l m n o 7 p q r s t u v w x y z { | } ~ DEL ISO 8859-1� 0 1 2 3 ¡ ¢ £ 4 5 6 7 8 9 ¨ © A B C 8 9 A B C D E F 3 ¥ ´ ¬ D E F 文字コードの多様化� 1文字当たり7ビットで表現する規格が国際標 準化� 7→8ビットに拡張� 日本では,漢字を利用するため8ビットでは足 らない� マルチバイトによる文字の表現� 日本国内で利用される規格� ISO(国際標準化機構)� ISO 646� ISO 2022� ISO 10646 UCS; Universal Multiple-Octet Coded Character Set� JSA(日本規格協会)� JIS X0201 7ビット及び8ビットの情報交換用符号文字集合� JIS X0202 文字符号の構造及び拡張法(ISO2022)� JIS X0208 � JIS X0212 補助漢字� JIS X0213 拡張漢字集合� JIS X0221 国際符号化文字集合(ISO10646)� 国内で代表的な符号化方式� ISO-2022-JP � ISO-2022-JP-1� JIS X0201, JIS X0208,� EUC-JP (日本語EUC)� ISO-2022-JP に加え,JIS X0212� CP932 (MS漢字コード,シフトJIS)� ASCII, JIS X0201, JIS X0208� ASCII, JIS X0208, JIS X0201, JISX0212� Unicode (UTF-8, UTF-16)� JIS X0221� JIS X0201� ISO 646 の日本バージョン� JSAにより1969年に規定� ASCIIを模倣したローマ字と日本語表記用 に新たに追加したカナ文字から構成� ローマ字コード(ISO 646 の NUP)� ISO646 IRV の5C「\」を「¥」に� 7E「~」を「¯」に変更�� JIS X0201 (ローマ字)� 0 8 9 A B C D E F 0 NULL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US 1 2 3 0 4 1 2 3 4 5 6 7 ! " # $ % & ' ( ) * + , - . / 1 2 3 4 5 6 7 8 9 : ; < = > ? A B C D E F G H I J K L M N O 5 P Q R S T U V W X Y Z [ ¥ ] ^ _ 6 ` a b c d e f g h i j k l m n o 7 p q r s t u v w x y z { | } ¯ DEL JIS X0201 (カナ文字)� 0 1 2 3 4 5 6 7 8 9 A B C D E F 。 「 」 、 ・ ヲ ァ ィ ゥ ェ ォ ャ ュ ョ ッ 8 9 A B ー ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ C タ チ ツ テ ト ナ ニ ヌ ネ ノ ハ ヒ フ ヘ ホ マ D ミ ム メ モ ヤ ユ ヨ ラ リ ル レ ロ ワ ン ゛ ゜ E F 未定義 JIS X0208 (JIS基本漢字)� ISO 2022 の枠内で漢字をコード化するため,2つの番号 (区点番号)で1つの文字を表す方式� GL,GR面には,94(96)文字利用可能なので,2バイト利 用して � 94 94=8836文字(現在は6355文字)� 符号表の横行を「区」(1区 94区)� 符号表の縦列を「点」(1点 94点)� 区を1バイト目,点を2バイト目とし,1区 94区を 33~126,1点 94点を33~126として符号化� JIS補助漢字,JIS拡張漢字も同様のコード化ルール� JIS X0208 (コード例)� 点 1 1 区 41 64 94 例えば, 「符」=41区68点 41+32 = 73 = 0x49 68+32 =100= 0x64 JIS X0208 コードは 0x4964 となる. 94 ISO 2022� エスケープシーケンス(ESC から始まる一 連のバイト列)により文字を拡張するための 規格� 7ビットと8ビットの2種類の拡張方法� JIS X0202 が ISO2022に対応� ISO2022� ESCシーケンスにより G0~G3に文字集合 の指示� ロッキング・シングルシ フトによりGL,GRに G0~G3を呼び出し� ISO2022� G0面への日本語文字集合の指示例� 文字集合� 指示面� ESC シーケンス� JIS X0208-1983� G0� ESC 02/4 04/2� ESC $ B� ISO 646-USA� (ASCII)� G0� ESC 02/8 04/2� ESC ( B� ISO 646-Japan� (JIS Roman)� G0� ESC 02/8 04/10� ESC ( J� JIS X0212-1990� G0� ESC 02/4 02/8 04/4� ESC $ ( D� ISO 2022-JP� ISO 2022 � 柔軟な多言語対応符号化� 柔軟過ぎる→実装が困難� あらかじめ文字集合を指示したり,取り決めをして おいて実装の負荷を減らす.� 日本語用の ISO 2022 実装の一つとして� ISO-2022-JP が作られた� 主にインターネットにおけるメールのやり取り� ISO 2022-JP 符号化例� 例えば,� � ISO符号化例� だと� 文字 I S O 機能・区点 04/09 05/03 04/0F 04/09 05/03 04/0F 01/0B 02/04 04/02 04/09 06/04 03/09 06/06 03/02 03/0D 04/0E 06/03 01/0B 02/08 04/02 00/0A I S O ESC $ B I d 9 f 2 = N c ESC ( B LF 符号 JIS X0208 を指示 符 号 化 例 41-68 25-70 18-29 46-67 ISO646 USA を指示 日本語EUC (EUC-JP)� UNIX系OSの標準的な日本語コード� Extended Unix Code の略� ISO 2022 に準拠,複数文字の共存� 必要に応じて制御文字で切り替え� G0 - ASCII� G1 - JIS X0208� G2 - JIS X0201� G3 - JIS X0212� GLにG0,GRにG1,必要に応じてG2/G3をシングルシフト2/3によ りGRに呼び出す.� シングルシフト2=08/14, SS2 (0x8E)� シングルシフト3=08/15, SS3 (0x8F)� 日本語EUC 符号化例� 例えば,� EUC符号化例� 文字 符号 E U C 45 55 43 E U C 符 C9 号 E4 41-68 B9 化 E6 25-70 B2 例 BD 18-29 CE E3 46-67 0A LF ISO 10646 (UCS)� 2バイトコードで全世界の文字を表現� 日中韓の似ている漢字を統合� 早々に破綻(UCS-2)� 31ビットを使用(UCS-4)� 統合基準が曖昧� ISO 2022と互換性無し� JIS X0221が国内の対応規格� JIS X0221� ISO 10646 の日本版� 群0x00~0x7F,128個の面からなる� 面は256x256の点からなる� 群オクテット� 面のオクテット� 区オクテット� 点オクテット� 4オクテット(=バイト)からなる UTF-8� UTF = UCS Transformation Format� UCS は内部処理用文字コード(wide character = 固 定バイト文字)として考えられたため,データ交換用の 符号化が必要� ASCIIと互換性を持たせたまま,ASCII以外の文字を 2~6バイトのコードに変換� 文字境界が分かりやすい� 1バイト目=0xxx xxxx または 11xx xxxx� 2バイト目以降=10xx xxxx� UTF-8 符号化例� 例えば,� UTF符号化例� 文字 符号 U T F 55 54 46 U T F 符 E7 AC 7B26 号 A6 E5 8F 化 B7 E5 53F7 8C 5316 例 96 E4 BE 8B 4F8B 符=00 00 7B 26 = 0000 0000 0000 0000 0111 1011 0010 0110 1110 0111 1010 1100 1010 0110 E 7 A C A 6 0A LF C言語の文字処理� char = 1バイト� 1バイト文字コードであればバイト数=文字数� マルチバイト文字であれば?� wchar_t ,wide character� マルチバイト用文字の内部処理用� 1文字=1wchar_t (内部的には32ビット)� 文字の区切り,文字数が数えやすく,処理がしやすい.� 改行コード� 制御文字の一種� CR キャッリジリターン� LF ラインフィード� 印字ヘッドを先頭に戻す� 紙を一行分送る� 計算機により改行コードも異なる� UNIX (Linux): LF (0x0A)� Windows: CR+LF (0x0D 0x0A)� Macintosh: CR (0x0D)�