文字コード略歴

: author

よこやままさふみ

: content-source

社内勉強会

: date

2012/05/18

: theme

lightning-clear-blue

: allotted-time

30m

自己紹介

* 横山昌史
* 入社4年目
* プログラマ etc...
* 所属プロジェクト
  * Java、UNIX、雑用 etc...
  * 文字コードの "るつぼ"

Rabbitについて

* プレゼンテーションツール
* 実装: Ruby/GTK
* 動作: UNIX/Win/Mac
* 文章とデザインの分離
  * バージョン管理しやすい

プロパティ

: background-image

lavie.png

: background-image-relative-width

50

文字コードとは

* 文字をコンピュータで扱うための符号化方式
* エンコード、キャラクターセットとも呼ばれる

符号化

* 文字や音声などを0と1のデジタルデータに変換すること
* 16進数で記述されることが多い
  * Javaなどでは、頭に"0x"を付けると16進数として扱われる

よく使われる文字コード

* ASCII
* Shift_JIS
* UTF-8(Unicode)
* EBCDIC

ASCII

ASCII

((‘tag:center’)) ((A))mericann ((S))tandardn ((C))ode forn ((I))nformationn ((I))nterchangen

ASCII

* 英語を表現するための文字コード
  * 英字アルファベット、記号
  * いわゆる半角文字

ASCII

* 1文字につき7ビットの1バイトコード
  * 7ビット = 2(('sup:7')) = 128
  * 16進数で言うと0x00〜0x7Fまで
  * 1バイト = 8ビットのため、1ビット余り

ASCIIの例

* Heisei 24
  * 48 65 69 73 65 69 20 32 34
    * 16進数(0xは省略)

JIS X 0201

* 日本工業規格
* 一部の符号位置がASCIIと違う
* 半角カナが使える
  * 8ビット目を拡張

ASCIIと異なる文字

* 符号位置0x5C
  * ASCII:半角バックスラッシュ
  * JISX0201:半角円記号

ASCIIと異なる文字

* 符号位置0x7E
  * ASCII:半角チルダ
  * JISX0201:半角オーバーライン

ASCIIと異なる文字

* ASCIIかJISX0201かは曖昧
  * 環境によって表示が変わる
* 日本のフォントは円記号
* 外国のフォントはバックスラッシュ
* 7Eは日本でも大抵チルダ

Shift_JIS

Q & A

* Q.あなたの母語は何語ですか?
  * A.日本語
* Q.日本語は英字アルファベットだけで表現できますか?
  * A.いいえ

ひらがなや漢字が必要

* 常用漢字 2,136文字(2010年改定)
* 1バイト = 8ビット = 2(('sup:8')) = 256
* 1バイトでは表現できない

2バイトコード

* 1文字を2バイトで符号化
* 2バイト = 16ビット = 2(('sup:16')) = 65,536

JIS X 0208

* 日本工業規格
* JIS第1・第2水準漢字を定義
* 最新版では6,879文字を収録
* 1983年に大幅な変更
  * 異字体の符号位置入れ替え
  * 字形の変更

JIS X 0213

* 日本工業規格
* JIS X 0208の拡張(後方互換)
* JIS第3・第4水準漢字を定義
* 環境によってはJISX0213に対応していない(JIS第3・第4水準漢字が使えない)

Shift_JISの成り立ち

((‘tag:center’)) JIS X 0201n +n JIS X 0208(JIS X 0213)n

Shift_JISの特徴

* 日本語が表現できる
* 半角カナが使える
  * JISX0201との互換性

Shift_JISの例

* 平成 24
  * 95 BD 90 AC 20 32 34

Shift_JISの欠点

* 全角半角問題
  * 「A」と「A」、「ア」と「ア」など
  * 全角文字を扱える文字コード共通の問題
* JISX0201の副作用
  * だめ文字

Shift_JISの派生

* WindowsではShift_JISを拡張した文字コードが使われている
  * Windows31-JやMS932やCP932などと呼ばれる
  * 重複符号化(㈱問題)
    * 同じ文字に複数の符号位置

UTF-8

Q & A

* Q.今はどんな時代ですか?
  * A.国際化時代
* Q.Shift_JISの欠点はどこですか?
  * A.日本語しか扱えない

Unicode

* 世界中の言語を表現できる文字コードの仕様がUnicode
* 110,181文字(2012年1月)

Unicode

* Unicodeの実装の一つがUTF-8
  * 他にもUTF-16など

UTF-8の特徴

* ASCIIを拡張
  * Shift_JISとは違い、JISX0201の拡張ではない
  * 半角カナなどの符号位置がShift_JISと違う
  * だめ文字がない

1文字のバイト数

* ASCII
  * 全て半角文字 = 全て1バイト
* Shift_JIS
  * 半角 = 1バイト
  * 全角 = 2バイト

1文字のバイト数

* UTF-8
  * 半角 = 主に1バイト
  * 全角 = 日本語は3バイト
    * 記号は3バイトか2バイト

UTF-8の例

* 平成 24
  * E5 89 B3 E6 88 90 20 32 34

1バイトでない半角文字

* \(半角)が2種類
  * 5C (ASCII): 規格上はバックスラッシュ
  * C2 A5 (UTF-8): 規格上は円記号
    * 2バイトの半角文字

1バイトでない半角文字

* ~(半角)も2種類
  * 7E (ASCII): 規格上はチルダ
  * E2 80 BE (UTF-8): 規格上はオーバーライン
    * 3バイトの半角文字

半角カナ

* ア (半角)
  * B1 (Shift_JIS)
  * EF BD B1 (UTF-8)
    * UTF-8の半角カナは全て3バイト
* 単純なバイト数チェックでは、半角か全角か判別できない

IBM版とMS版

* IBM-Unicode(一般的なUnicode)とMS-Unicode(マイクロソフト版Unicode)で符号位置が異なる文字がある
  * いわゆる波ダッシュ問題の要因

波ダッシュ問題

* Windowsとそれ以外のOS間での通信時などに文字化け
* 対象文字は10文字程度(環境による)
  * ~ ― - ‖ ∥ ¦ ¬ ¢ £

EBCDIC

EBCDIC

* IBMによって定義された文字コード
  * IBM製のメインフレーム(汎用機)などで現在も使用されている

EBCDIC

* 半角文字の符号位置がASCIIと異なる
* 全角文字の表現方法がShift_JISやUTF-8と異なる
* 基本的にJIS第3・第4水準は含まれない

半角文字

* すべて1バイト
  * 8ビット目まで使用
* 制御文字エリアが大きい
  * 0x00~0x3Fと0xFF
  * 汎用機で使用される特殊な制御文字が含まれている

全角文字

* 半角文字との区別は制御文字で行う
  * 全角の開始位置がシフトアウト(0x0E)
  * 全角の終了位置がシフトイン(0x0F)
* 略してSO/SIなどと呼ばれる

SO/SI

* 平成 24
  * ((*0E*)) 45 8D 45 BA ((*0F*)) 40 F2 F4

うわっ…

* SIの欠如
  * ((*0E*)) 45 8D 45 BA
* SO/SIのネスト
  * ((*0E*)) 45 8D ((*0E*)) 45 BA ((*0F*)) ((*0F*))
* SO/SIを対として扱うのではなく、モード切替文字として扱うことで対応

まとめ

# image
# src = summary.jpg
# relative_height = 100

参考

* プログラマのための文字コード技術入門
* 正規表現クックブック(66ページ)
* AIX 5L 日本語コード一覧表
  * jp_codebookで検索

ご静聴ありがとうございました。