文字コード 情報処理3 今井孝明
文字は0と1へ変換されて記録される コンピュータの内部では文字などのデータは0と1へ変換されて保存される。例えば A ⇨ 01000001 B ⇨ 01000010 C ⇨ 01000011 ! ⇨ 00100001 $ ⇨ 00100100 という感じである。
変換の仕方は何通りかある 同じ文字でも0と1へ変換する仕方は何通りかある この変換の仕方を文字コードという 明 ⇨ 0110011 00001110 (Windows) 明 ⇨ 11100110 10011000 10001110 (iPhone) 明 ⇨ 11100110 10011000 10001110 (Android) 同じ文字でも0と1へ変換する仕方は何通りかある この変換の仕方を文字コードという
文字コード iPhoneとAndroidは同じ文字コードを使っている 明 ⇨ 0110011 00001110 (Windows) ←UTF-16 明 ⇨ 11100110 10011000 10001110 (iPhone) ← UTF-8 明 ⇨ 11100110 10011000 10001110 (Android) ← UTF-8 iPhoneとAndroidは同じ文字コードを使っている
代表的な文字コード Shift-JIS (cp932) 昔のパソコン、windowsのメモ帳、コマンドプロンプト、携帯の大部分、日本語しか扱えない EUC-JP 昔の大きなコンピュータ、ちょっと昔のホームページ UTF-8 最近のホームページ、iPhone、Perl、JAVA、世界中の言語を扱える UTF-16 Windows内部、世界中の言語を扱える
文字コードによって使える文字が決まっている 昔の日本のパソコンメーカーだったら日本語だけを扱えるコンピュータをつくればよかった。 日本語 {あ,い,,,,ア,イ,,,一,二,三,,,} 昔の日本のパソコンで使われていた文字コードであるShift-JISにはドイツ語の文字äを0と1に変換する方法は存在しない。 ä → × 文字コードで使える文字の種類を文字集合(文字セット)という。 Shift-JISとEUC-JPは文字集合は同じであるが、0と1を割り当てる方法が異なる。文字に0と1を割り当てることを符号化という。 現実的にはありえないが説明のための簡単な例として 2文字{ A , B }だけの文字集合を考える。 A=0,B=1 とすることも可能であるし、 A=1,B=0 とすることも可能である。 このように同じ文字集合に0,1を割り当てる方法はいろいろある。 昔どこかのおじさんが決めたShift-JISの一覧表、EUC-JPの一覧表が存在するのでそれを見れば特定の文字を0と1に変換する方法がわかる。 「文字集合」と「符号化」を合わせて文字コードという。
Unicode (UTF-8,UTF-16) 鷗,頰,𠮷,,, ✡, é,à,è,ù,ç,œ,ê,ï,â ä,ö,ü,ß, 태연,,, など10万文字以上 cp932 (Windows-31J) 彅,仡,仼,,,など7517文字 JIS X 0208 (Shift-JIS,EUC-jp) 山,川,犬,猫,辺,,,,など7070文字
ユニコード Shift-JIS(cp932),EUC-JPは日本語を表すことはできるが、日本語とドイツ語と中国語の混在した文章を表すことができない。 世界中の全ての文字を集めた文字集合を使うことにすればどんな言語でも扱えるようになり、都合がよい。 {あ,い,,,,ア,イ,,,一,二,三,,, Б,Д,Ж,,,, α,β,γ,,,태연,,,} この文字集合をユニコードという。日本語からは第1,2水準漢字以外にも第3,4水準漢字も収められている。 符号化の仕方によって、UTF-8,UTF-16,UTF-32,UCS-2 などいくつか種類がある。
Shift-JISとEUC-JP Shift-JIS,EUC-JPはJIS第一水準、第二水準合計約6800の漢字を使える Shift-JIS (cp932) 1~2byte A 01000001 明 10010110 10111110 EUC-JP 1~2byte A 01000001 明 11001100 11000000
Shift-JISとcp932の違い Shift-JISを拡張したものがcp932であり、ほとんど一緒であるが、ちょっとだけ違う。 ほとんど一緒なのでcp932はShift-JISと表記されることもあり紛らわしい。Windowsのメモ帳はShift-JISと表記されているが、正しくはcp932である。
ユニコード2 WindowsはUTF-16が使われている。 (しかし、昔のWindows日本語版はShift-JIS(cp932)を採用していたので、現在でもコマンドプロンプトやメモ帳では特に指定しなければShift-JIS(cp932)が使われるので注意が必要である。) 最近のLinux,Mac OS,Perl,JAVAはUTF-8を使っている。 古いシステムやプログラムはユニコードに対応していない。 将来的にはユニコードに統一されていくと思われる。
bit 0と1の文字1つを1bit(ビット)という。 0 1bit 1 1bit 00 2bit 01 2bit 10 2bit 11 2bit 100 3bit
byte コンピュータ内部では英数字は8bitで表現される。8bitを1byte(バイト)という。 A 01000001 8bit = 1byte
2進数と16進数 0と1だけで表現すると長くなるので 4つの0,1を右のように1つの 文字に置き換える 0000 0001 1 0010 2 0011 3 0100 4 0101 5 0110 6 0111 7 1000 8 1001 9 1010 A 1011 B 1100 C 1101 D 1110 E 1111 F 0と1だけで表現すると長くなるので 4つの0,1を右のように1つの 文字に置き換える 4bitづつに分けて置き換える。 明 ⇨ 10010110 10111110 (Shift-JIS) 9 6 B E 0x96BE と書いたり 0x96 0xBE と書いたりする 0と1だけを使って書く方法を2進数という 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,Fの16文字 を使って書く方法を16進数という
Shift-JISの調べ方 「明」という文字をShift-JISで変換したらどうなるか調べよう。 http://www.seiai.ed.jp/sys/text/java08/shiftjis_table.html にある一覧表から「明」を探す。 96B0の最後の0をEに置き換えて、96BEとなる。
UTF-8の調べ方 「明」という文字をUTF-8で変換したらどうなるか調べよう。 http://www.fileformat.info/info/unicode/char/search.htm をひらき「明」を検索する。 となることがわかる。 (hexは16進数のことbinaryは2進数のこと)
use utf8; ⇦ プログラムをUTF-8で書いたことを表す (秀丸で作成) UTF-8 ActivePerl UTF-8 コマンドプロンプト cp932
Alphabetはほとんどの文字コードで符号化が同じ Shift-JIS(cp932)でもUTF-8でもEUC-JPでもalphabetの符号化は同じである。 A 01000001 (1バイト) よってalphabetしか使わない限りは文字コードの違いを意識しないでも困らない alphabetしか使わないアメリカ人の作ったプログラムは文字コードの違いを考慮していないものがある。
制御文字 Enterや、タブなども Enter 00001101 00001010 タブ 00001011 のように0と1の集合として記録される。 リターンやタブは通常の文字と異なるので制御文字と言われる。
課題 以下の問いに答えよ。答えはメールの本文に書いてください。 問題1. 1バイトは何ビットか? 問題2. 自分の名前をShift-JISで変換するとどうなるか。2進数で表現した場合と16進数で表現した場合の両方を答えよ。 問題3. 自分の名前をUTF-8で変換するとどうなるか。2進数で表現した場合と16進数で表現した場合の両方を答えよ。
日本語は1byteでは足りない アルファベットは26個である。小文字を含めても52個である。その他、.や?などを入れても、1byteあれば十分である。 しかし、日本語は256個では足りない。 コンピュータは主にアメリカで発達したものであるので、基本はアルファベットにしか対応していないものが多い。 日本語の文字を扱うための方法は後からつけ加えられた。
Shift-JIS(cp932)とUTF-8 例えば、秀丸などで「明治」と書いて保存したとしよう。 CP932
改行(Enter)について1 改行(Enter)はタイプライターの時代から使われていた。 タイプライターは、1文字打つごとに紙全体を左へずらしていく。文章が紙の右端まで来たら、次の行に行くために 紙全体を元に戻し(キャリッジリターン,CR) 紙を上方に1行分ずらす(ラインフィード,LF) 必要がある。 なそ、キャリッジとはタイプライター(印字端末)で紙を固定する装置のことである。 この用語が、コンピュータにも採用された。
改行について2 Windowsでは改行をCRを表す00001101とLFを表す00001010とを合わせて表現する。 そもそも「タイプライター」という装置が、1行進める作業と左に戻す作業が別々に存在したことを引きずっているわけである。 Unix系のOSではLFを表す00001010だけで表現する。 Mac OSでは改行をCRを表す00001101だけで表現する。
例 例えば、 open ( FILE1 , ”>” , text.txt ); print FILE1 “A\n”; close ( FILE1 ); とすると、text.txtには 01000001 00001101 00001010 A CR LF と書きこまれる。