SlideShare une entreprise Scribd logo
1  sur  68
Télécharger pour lire hors ligne
KMC例会講座
27/11/9
コンピュータで文字を扱おう
~文字コード基礎論A~
前置き
・たぶん文字をコンピュータで扱うと聞いて何を
思うかは二種類に分かれる
1.「なにそれ、簡単でしょ」
2.「はー。闇。。。」
前置き
・私の意見では、闇です
・文字をコンピュータで扱うときは
普通文字コードというものを使うのですが、
これが複雑怪奇を極める
前置き ~最近の実例~
「あれ、フォントがうまくできない」
→シェルスクリプトがメモ帳のせいで
勝手にUTF-8(BOM付き)で保存されていた!
「Visual Studioで作ったゲームのタイトルが
文字化けする」
→ソースコードの文字コードをShift-JISから
UTF-8(BOM付き)に直したら化けなくなった
前置き
・こういうのはネットで調べても初心者は意味不明
・とにもかくにも出てくる単語・概念が多すぎる
・しかも、文字コードの体系自体が結構グダグダ、
かつ日本の場合は国の国語政策すらもグダグダ、
その両方が絡んでもうほんとやめてくれって感じ
人間の宿命
・闇があったら照らそうと思わねばならぬ
・闇を照らすためにいろいろ考えました
・「最近、数学が楽しい!!」
→数学の言葉で書けそう! やってみよっ!
自己紹介
・ID:suzusime
・京都大学理学部理学科一回生(物理系志望)
・お絵かき練習します
・フォントを作ったりしました
・プログラムはC++くらいしかできません
・TwitterとかQiitaとかもだいたいid:suzusimeです
今回の目的
・文字コードを基礎を集合論の言葉を用いることで
見通しよく記述することを試みます
・実用上で役立ちそうなことをおまけとして
入れました
・予備知識は仮定しません
目次
1.文字コードとは
2.文字→ビット列の写像をつくる
3.ビット列→文字の写像をつくる
4.文字コード変換
目次
1.文字コードとは
2.文字→ビット列の写像をつくる
3.ビット列→文字の写像をつくる
4.文字コード変換
さて、質問です
・文字ってなんですか!?
ある国語学者の答え
文字は、音及び意味を表出する主体の働きの一段階
として、又これによって、言語的経験を獲得する主
体の理解作用の一契機として考えなければならな
い。
(時枝誠記『国語学原論』より)
ある国語学者の答え
文字は、音及び意味を表出する主体の働きの一段階
として、又これによって、言語的経験を獲得する主
体の理解作用の一契機として考えなければならな
い。
(時枝誠記『国語学原論』より)
……むずかしいことわかんない!
簡単にした
・まあこんなものでしょう
人
文字
人
コンピュータで使うには
・ビット列(2進数の列)に変換して交換する
人 文字
人
ビ
ッ
ト
列
文字
コンピュータで使うには
・ビット列(2進数の列)に変換して交換する
人 文字
人
ビ
ッ
ト
列
文字
ここのしくみが大事
それが文字コード
・文字をビット列に割り当てる方法の決まり
目次
1.文字コードとは
2.文字→ビット列の写像をつくる
3.ビット列→文字の写像をつくる
4.文字コード変換
文字コードの概観
・下の写像の決め方が文字コード(体系)
文字全体の集合V ビット列の集合B
f
「包摂」という概念
・文字コードを語る上で避けては通れない
・文字コードについての話が複雑になるのは
これが原因である部分が大きい
・だが、そもそもこれがないと文字を識別して
番号を振れないのでやっぱり必要
「包摂」という概念
・読んでみて下さい
南家の郎女の神隠しに遭ったのは、其夜であった。
南家の郎女の神隠しに遭ったのは、其夜であった。
南家の郎女の神隠しに遭ったのは、其夜であった。
・これらは同じ文ですか?
「包摂」という概念
・私たちは少し形が違っても同じ文字と考える
ような文字がある。この二項関係「~」が包摂
南~南 南~南 南~南
家~家 家~家 家~家
の~の の~の の~の
…
「包摂」という概念
・図にしてみるとこうなる
南
家
の
の南
…
家
家
…
…
南
の
…
「包摂」という概念
・図にしてみるとこうなる
あっ、私これ知ってる! 同値類っていうやつだ!
南
家
の
の南
…
家
家
…
…
南
の
…
「(符号化)文字集合」の導入
・さっきの同値類を並べてできる集合を
文字集合といいます
文字集合C = { , , , ...}
・文字集合には何らかの全順序が入れられて、
自然数の有限個の部分集合との間に全単射が
作れます(これを符号化文字集合といいます)
「(符号化)文字集合」の導入
・つまり、
文字集合C=V /~(V の同値関係~による商集合)
但し V:符号化したい範囲の全ての文字の集合
~:包摂
符号化文字集合S ⊂N は Cと一対一に対応する
→Sで文字の同値類を表してよい
符号化文字集合の表し方
・同値類はその代表をひとつ選べばそれで表せる
南
家
の
南
…
家
…
…
の
…南
家
の
符号化文字集合の表し方
・表をつくることで符号化文字集合を表せる
※表にあるのはあくまで代表であることに注意
の 南 家 ...
0 1 2 ...番号
代表
(例示字形)
文字コードの概念図
・最初に挙げた写像fは次の写像の合成として作れる
・hの決め方を符号化方式といいます
V C S B
π g h
π:VからC = V /~への自然な射影。全射
g:番号をつける写像。全単射
h:番号をビット列に変換する写像。全単射
例:
・符号化文字集合がUnicode,符号化方式がUTF-8
V C S B
南
南
南
南
南
…
南
0x5357
(U+5357)
ED 85 97
↑
Unicodeの
符号化文字集合
↑
符号化方式
UTF-8による
ビット列
例:
・符号化文字集合がUnicode,符号化方式がUTF-8
V C S B
南
南
南
南
南
…
南
0x5357
(U+5357)
ED 85 97
↑
Unicodeの
符号化文字集合
↑
符号化方式
UTF-8による
ビット列
1対1 1対1
1対1
じゃない
文字コードの決定条件
今見たことからわかるように
・文字全体の集合V
・包摂~
・番号の振り方g
・符号化方式h
これを決めれば文字を一意にビット列に変換できる
ような規則が作れる(文字コード体系ができる)
文字コードの決定条件(補足)
・実際はVを決めるのは不可能なので、
先に文字集合Cを決めてからCに移せるような
文字の全体の集合をVとする
・gにはほとんど実質的な意味はない
・hは実用上の使いやすさを決めるものだが、
理論的にはなんでもいい
・問題となるのは包摂~の基準の決め方
包摂基準
・これは同じ文字
あ あ あ
包摂基準
・これは同じ文字……?
南 南
包摂基準
・これは同じ文字……?
冷 冷
包摂基準
・これは同じ文字……?
瀕 瀕
包摂基準
・これは同じ文字……?
謎 謎
包摂基準
・これは同じ文字…?
裏 裡
包摂基準
・これは同じ文字???
霊 靈
包摂基準の闇
・こんなふうにどこまでを同じ文字と見做すかの
線を引くことはとても難しい
・おおざっぱに分けると細かい字の違いが表せず、
細かく分けると検索などに不便がある
・しかも人によって、場合によって必要な細かさが
異なってくる(文学作品、人名、地名 etc.)
包摂基準が違う例
・JISの場合(符号化方式はShift-JIS)
鷗
鴎
祇
祇
V C S B
鴎 鷗 …
祇 祇 …
18面10点
21面32点
89 A8
8B 5F
包摂基準が違う例
・Unicodeの場合(符号化方式はUTF-8)
鷗
鴎
祇
祇
V C S B
鷗 …
祇 祇 …
U+9DD7
U+7947
E9 B7 97
E7 A5 87
鴎 … U+9D0E E9 B4 8E
包摂基準は文字コードの魂
・包摂の細かさは文字コードの表現力そのもの
・包摂基準の作り方が文字コードを決める!!
・JISで「鷗」が打てないとか批判されまくったので
だいたい新しいほど細かくなる
(これはフォントの側の問題でもある(後述))
休憩
・ここまで長かった
・でも、これで半分なんですよ……
・文字→ビット列 の方向はできた。おめでとう
・でも、ビット列→文字 をしなきゃならない
・ただ逆はそれほど長くはなりません
目次
1.文字コードとは
2.文字→ビット列の写像をつくる
3.ビット列→文字の写像をつくる
4.文字コード変換
再掲
・符号化文字集合がUnicode,符号化方式がUTF-8
V C S B
南
南
南
南
南
…
南
0x5357
(U+5357)
ED 85 97
↑
Unicodeの
符号化文字集合
↑
符号化方式
UTF-8による
ビット列
1対1 1対1
1対1
じゃない
再掲
・符号化文字集合がUnicode,符号化方式がUTF-8
V C S B
南
南
南
南
南
…
南
0x5357
(U+5357)
ED 85 97
↑
Unicodeの
符号化文字集合
↑
符号化方式
UTF-8による
ビット列
1対1 1対1
1対1
じゃない
逆写像
・単射じゃないので逆写像は定義できません
V C S B
南
南
南
南
南
…
南
0x5357
(U+5357)
ED 85 97
↑
Unicodeの
符号化文字集合
↑
符号化方式
UTF-8による
ビット列
1対1 1対1
どれ?
逆写像ではないけれど
・C→Vはフォントに依存させて決められる
V C S B
南
南
南
南
南
…
南
0x5357
(U+5357)
ED 85 97
↑
Unicodeの
符号化文字集合
↑
符号化方式
UTF-8による
ビット列
1対1 1対1
これ
こういう場合も
・こういうものもフォント依存になってしまう
V C S B
…
祇 U+7947 E7 A5 87
↑
Unicodeの
符号化文字集合
↑
符号化方式
UTF-8による
ビット列
1対1 1対1
これ
祇
祇
祇
例示字形の影響
・多くのフォントが例示字形と同じようにする
V C S B
…
祇 U+7947 E7 A5 87
↑
Unicodeの
符号化文字集合
↑
符号化方式
UTF-8による
ビット列
1対1 1対1
これ
祇
祇 祇
↑
例示字形
例示字形の影響
・例示字形はただ同値類の代表であるだけのはず
・しかし実際はほとんどのフォントが例示字形に
従った実装をしてしまう
・たまに「例示字形の変更」が行われたりする
・†闇†
文字コードの限界
・ビット列から一意に復元できるのは
文字集合Cの元(Vの同値類)にまで
・文字の電子化も多分に漏れず不可逆変換
文字コードの概念図
・ビット列から文字を得る写像は次のようになる
・これでもとに戻せるようになった。やったね!
V C S B
φ g-1
h-1
φ:フォント依存の写像
g:番号をつける写像。全単射
h:番号をビット列に変換する写像。全単射
目次
1.文字コードとは
2.文字→ビット列の写像をつくる
3.ビット列→文字の写像をつくる
4.文字コード変換
文字コード変換
・ある文字コードによって得られたビット列を
異なる文字コードによるビット列に変換する
文字コード変換
・ある文字コードによって得られたビット列を
異なる文字コードによるビット列に変換する
・「多様体の基礎」の最初にでてくる座標変換を
みてそれと同じことをすれば良いと思った
文字コード変換
・図で見るのが早い
S1 B1
S2 B2
C1∩C2
g1
-1 h1
-1
g2
h2
文字コード変換の例
・C1=C2の例:UTF-8からUTF-16(Little Endian)
・妥当な(ちゃんとした)変換になっている
C1∩C2 S1=S2 B1
南
南
…
南
0x5357
(U+5357)
ED 85 97 UTF-8
B2
57 53 UTF-16
(LE)
文字コード変換の例
・じゃあ、C1≠C2のときはどうか
Shift-JISからUTF-8の変換例
・これは妥当な変換?
89 A818面10点鴎
鴎 U+9D0E E9 B4 8E UTF-8
Shift-JIS
文字コード変換の例
・じゃあ、C1≠C2のときはどうか
Shift-JISからUTF-8の変換例
・これは妥当な変換? ではない
89 A818面10点鴎
鴎 U+9D0E E9 B4 8E UTF-8
Shift-JIS
文字コード変換の例
・文字集合の元はあくまで文字の同値類
本当は下のようになっている
・もしかしたら元は「鷗」だったかもしれない!
89 A818面10点
U+9D0E E9 B4 8E
鴎 鷗 …
鴎 …
文字コード変換の問題
・文字集合が異なる文字コードのビット列の間の
変換は、包摂規準が異なるためにうまくできない
・同値類の代表が同じに見えるからといって
騙されてはいけない
・知らず知らずのうちに情報を失ってしまう!!
文字コード変換の問題
・今回の発表でいいたかったこと
「文字コードの安易な変更は危険」
・文字コードの包摂規準をある程度は把握して、
目的に合った文字コードを選択しよう!
とはいったものの……
・たぶんこのことは世の99%の人は意識していない
・実際は文字コードの間の変換をすることも
たくさんある
・でも、こういうことが実は起こっていると
知っておくと、役に立つのではないでしょうか
まとめ
・文字コードの魂は包摂規準
・同値類の代表に惑わされるな
・文字コード間の変換をできるだけしないでも
済むように入力するときに考えよう
これが闇を照らす一条の光とならんことを……
以上
・ご静聴ありがとうございました

Contenu connexe

En vedette

Linux でavr開発環境を構築する+mbed(20100612koedo94)
Linux でavr開発環境を構築する+mbed(20100612koedo94)Linux でavr開発環境を構築する+mbed(20100612koedo94)
Linux でavr開発環境を構築する+mbed(20100612koedo94)
Kenichiro MATOHARA
 

En vedette (20)

C#でゲームを作る2016 第1回
C#でゲームを作る2016 第1回C#でゲームを作る2016 第1回
C#でゲームを作る2016 第1回
 
Windows改造計画
Windows改造計画Windows改造計画
Windows改造計画
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
よいコード、わるいコード
よいコード、わるいコードよいコード、わるいコード
よいコード、わるいコード
 
明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
 
Google Photosにネットで拾ったイラストを溜め込む
Google Photosにネットで拾ったイラストを溜め込むGoogle Photosにネットで拾ったイラストを溜め込む
Google Photosにネットで拾ったイラストを溜め込む
 
BFmeta
BFmetaBFmeta
BFmeta
 
CUI3D
CUI3DCUI3D
CUI3D
 
まんが日本昔ばなし
まんが日本昔ばなしまんが日本昔ばなし
まんが日本昔ばなし
 
オセロの終盤ソルバーを100倍以上高速化した話
オセロの終盤ソルバーを100倍以上高速化した話オセロの終盤ソルバーを100倍以上高速化した話
オセロの終盤ソルバーを100倍以上高速化した話
 
C#でゲームを作る2016 第5回
C#でゲームを作る2016 第5回C#でゲームを作る2016 第5回
C#でゲームを作る2016 第5回
 
C#でゲームを作る2016 第7回
C#でゲームを作る2016 第7回C#でゲームを作る2016 第7回
C#でゲームを作る2016 第7回
 
Topological data analysis
Topological data analysisTopological data analysis
Topological data analysis
 
GoでMinecraftっぽいの作る
GoでMinecraftっぽいの作るGoでMinecraftっぽいの作る
GoでMinecraftっぽいの作る
 
平衡二分探索木の並行化
平衡二分探索木の並行化平衡二分探索木の並行化
平衡二分探索木の並行化
 
文字コードとセキュリティ
文字コードとセキュリティ文字コードとセキュリティ
文字コードとセキュリティ
 
フィーリングで読む40種類のアセンブラ(オープンソースカンファレンス2013 Tokyo/Spring ライトニングトーク)
フィーリングで読む40種類のアセンブラ(オープンソースカンファレンス2013 Tokyo/Spring ライトニングトーク)フィーリングで読む40種類のアセンブラ(オープンソースカンファレンス2013 Tokyo/Spring ライトニングトーク)
フィーリングで読む40種類のアセンブラ(オープンソースカンファレンス2013 Tokyo/Spring ライトニングトーク)
 
新しい生活をLinuxといっしょに始めよう!
新しい生活をLinuxといっしょに始めよう!新しい生活をLinuxといっしょに始めよう!
新しい生活をLinuxといっしょに始めよう!
 
Linux でavr開発環境を構築する+mbed(20100612koedo94)
Linux でavr開発環境を構築する+mbed(20100612koedo94)Linux でavr開発環境を構築する+mbed(20100612koedo94)
Linux でavr開発環境を構築する+mbed(20100612koedo94)
 
文字コード略歴
文字コード略歴文字コード略歴
文字コード略歴
 

Similaire à 文字コード基礎論A

Kobe sec#8 summary
Kobe sec#8 summaryKobe sec#8 summary
Kobe sec#8 summary
Yukio NAGAO
 
デブサミでLiveコーディングしてきた - きよくらならみ
デブサミでLiveコーディングしてきた - きよくらならみデブサミでLiveコーディングしてきた - きよくらならみ
デブサミでLiveコーディングしてきた - きよくらならみ
WPArch
 

Similaire à 文字コード基礎論A (16)

Linux desktop on_personalwork
Linux desktop on_personalworkLinux desktop on_personalwork
Linux desktop on_personalwork
 
第2回 IT講座 ゲームを作るって?
第2回 IT講座 ゲームを作るって?第2回 IT講座 ゲームを作るって?
第2回 IT講座 ゲームを作るって?
 
初心者目線でIo t
初心者目線でIo t初心者目線でIo t
初心者目線でIo t
 
Unityとスマートフォンアプリの最適化
Unityとスマートフォンアプリの最適化Unityとスマートフォンアプリの最適化
Unityとスマートフォンアプリの最適化
 
FPGAでmrubyを動かす
FPGAでmrubyを動かすFPGAでmrubyを動かす
FPGAでmrubyを動かす
 
[2013_04]新入生用スライド
[2013_04]新入生用スライド[2013_04]新入生用スライド
[2013_04]新入生用スライド
 
Kobe sec#8 summary
Kobe sec#8 summaryKobe sec#8 summary
Kobe sec#8 summary
 
プログラマのためのPC自動化
プログラマのためのPC自動化プログラマのためのPC自動化
プログラマのためのPC自動化
 
Our docsys-pyfes-2012-11
Our docsys-pyfes-2012-11Our docsys-pyfes-2012-11
Our docsys-pyfes-2012-11
 
Marp for VS Code で作る PowerPoint スライド
Marp for VS Code で作る PowerPoint スライドMarp for VS Code で作る PowerPoint スライド
Marp for VS Code で作る PowerPoint スライド
 
apasec001-kawai
apasec001-kawaiapasec001-kawai
apasec001-kawai
 
IEとメモ帳でかんたんゲーム開発
IEとメモ帳でかんたんゲーム開発IEとメモ帳でかんたんゲーム開発
IEとメモ帳でかんたんゲーム開発
 
デブサミでLiveコーディングしてきた - きよくらならみ
デブサミでLiveコーディングしてきた - きよくらならみデブサミでLiveコーディングしてきた - きよくらならみ
デブサミでLiveコーディングしてきた - きよくらならみ
 
Perlと電子工作をつなげてみた v1.1.0
Perlと電子工作をつなげてみた v1.1.0Perlと電子工作をつなげてみた v1.1.0
Perlと電子工作をつなげてみた v1.1.0
 
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>
  そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>  そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>
 
USB3 host driver program structure
USB3 host driver program structureUSB3 host driver program structure
USB3 host driver program structure
 

Plus de 京大 マイコンクラブ

Plus de 京大 マイコンクラブ (20)

テキストファイルを読む💪 第1回
テキストファイルを読む💪  第1回テキストファイルを読む💪  第1回
テキストファイルを読む💪 第1回
 
かわいくなろうとしたら語彙力が下がった話
かわいくなろうとしたら語彙力が下がった話かわいくなろうとしたら語彙力が下がった話
かわいくなろうとしたら語彙力が下がった話
 
Common Lisp入門
Common Lisp入門Common Lisp入門
Common Lisp入門
 
多倍長整数の乗算と高速フーリエ変換
多倍長整数の乗算と高速フーリエ変換多倍長整数の乗算と高速フーリエ変換
多倍長整数の乗算と高速フーリエ変換
 
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタつくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ
 
Geometry with Unity
Geometry with UnityGeometry with Unity
Geometry with Unity
 
セミコロンレスc++
セミコロンレスc++セミコロンレスc++
セミコロンレスc++
 
エンジニアと健康
エンジニアと健康エンジニアと健康
エンジニアと健康
 
女の子になれなかった人のために
女の子になれなかった人のために女の子になれなかった人のために
女の子になれなかった人のために
 
Pietで競プロしよう
Pietで競プロしようPietで競プロしよう
Pietで競プロしよう
 
もし太陽のコアがIntelCoreだったら
もし太陽のコアがIntelCoreだったらもし太陽のコアがIntelCoreだったら
もし太陽のコアがIntelCoreだったら
 
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
 
ドット絵でプログラミング!難解言語『Piet』勉強会
ドット絵でプログラミング!難解言語『Piet』勉強会ドット絵でプログラミング!難解言語『Piet』勉強会
ドット絵でプログラミング!難解言語『Piet』勉強会
 
No SSH (@nojima; KMC関東例会)
No SSH (@nojima; KMC関東例会)No SSH (@nojima; KMC関東例会)
No SSH (@nojima; KMC関東例会)
 
DTM練習会2017第1.5回 「伴奏の付け方」
DTM練習会2017第1.5回 「伴奏の付け方」DTM練習会2017第1.5回 「伴奏の付け方」
DTM練習会2017第1.5回 「伴奏の付け方」
 
hideya流 テストプレイ観察術
hideya流 テストプレイ観察術hideya流 テストプレイ観察術
hideya流 テストプレイ観察術
 
暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編
 
Altseed
AltseedAltseed
Altseed
 
C#でゲームを作る2016 第3回
C#でゲームを作る2016 第3回C#でゲームを作る2016 第3回
C#でゲームを作る2016 第3回
 

文字コード基礎論A