SlideShare a Scribd company logo
1 of 33
Download to read offline
テキストファイルの話
・   文字化けで読めないページがある
・   受け取った文書ファイルが開けない
・   ウムラウト記号が壊れた
・   「髙橋」という入力が弾かれた
・   ①って書いたら怒られた
・   etc.

→なんで?
  どういう原理で?
001100010011100000101110001000000100100001100101011011100110001101100101001000000111010001101
000011001010010000001110011011000010111100101101001011011100110011100111010001000000010000001
                                                               とあるファイル
001001011001100010000001111001011011110111010100100000011010110110111001101111011101110010000
001110100011010000110010100100000011001010110111001100101011011010111100100001101000010100010
000000100000001000000010000001100001011011100110010000100000011010110110111001101111011101110
010000001111001011011110111010101110010011100110110010101101100011001100010110000100000011110
010110111101110101001000000110111001100101011001010110010000100000011011100110111101110100001
000000110011001100101011000010111001000100000011101000110100001100101001000000111001001100101
011100110111010101101100011101000010000001101111011001100010000001100001000011010000101000100
000001000000010000000100000011010000111010101101110011001000111001001100101011001000010000001
100010011000010111010001110100011011000110010101110011001011100010000000100000010010010110011
000100000011110010110111101110101001000000110101101101110011011110111011100100000011110010110
111101110101011100100111001101100101011011000110011000100000011000100111010101110100001000000
110111001101111011101000010000001110100011010000110010100100000011001010110111001100101011011
010111100100101100000011010000101000100000001000000010000000100000011001100110111101110010001
000000110010101110110011001010111001001111001001000000111011001101001011000110111010001101111
011100100111100100100000011001110110000101101001011011100110010101100100001000000111100101101
111011101010010000001110111011010010110110001101100001000000110000101101100011100110110111100
100000011100110111010101100110011001100110010101110010001000000110000100100000011001000110010
101100110011001010110000101110100001011100010000000001101000010100010000000100000001000000010
000001001001011001100010000001111001011011110111010100100000011010110110111001101111011101110
010000001101110011001010110100101110100011010000110010101110010001000000111010001101000011001
010010000001100101011011100110010101101101011110010010000001101110011011110111001000100000011
110010110111101110101011100100111001101100101011011000110011000101100001000000111100101101111
011101010010000001110111011010010110110001101100000011010000101000100000001000000010000000100
000011100110111010101100011011000110111010101101101011000100010000001101001011011100010000001
100101011101100110010101110010011110010010000001100010011000010111010001110100011011000110010
1001011100000110100001010
00110001   00111000   00101110   00100000   01001000   01100101   01101110   01100011   01100101   00100000   01110100
01101000   01100101   00100000   01110011   01100001   01111001   01101001   01101110   01100111   00111010   00100000
00100000   01001001   01100110   00100000   01111001   01101111   01110101   00100000   01101011   01101110   01101111
01110111   00100000   01110100   01101000   01100101   00100000   01100101   01101110   01100101   01101101   01111001
00001101   00001010   00100000   00100000   00100000   00100000   01100001   01101110   01100100   00100000   01101011
01101110   01101111   01110111   00100000   01111001   01101111   01110101   01110010   01110011   01100101   01101100
01100110   00101100   00100000   01111001   01101111   01110101   00100000   01101110   01100101   01100101   01100100
00100000   01101110   01101111   01110100   00100000   01100110   01100101   01100001   01110010   00100000   01110100
01101000   01100101   00100000   01110010   01100101   01110011   01110101   01101100   01110100   00100000   01101111
01100110   00100000   01100001   00001101   00001010   00100000   00100000   00100000   00100000   01101000   01110101
01101110   01100100   01110010   01100101   01100100   00100000   01100010   01100001   01110100   01110100   01101100
01100101   01110011   00101110   00100000   00100000   01001001   01100110   00100000   01111001   01101111   01110101
00100000   01101011   01101110   01101111   01110111   00100000   01111001   01101111   01110101   01110010   01110011
01100101   01101100   01100110   00100000   01100010   01110101   01110100   00100000   01101110   01101111   01110100
00100000   01110100   01101000   01100101   00100000   01100101   01101110   01100101   01101101   01111001   00101100
00001101   00001010   00100000   00100000   00100000   00100000   01100110   01101111   01110010   00100000   01100101
01110110   01100101   01110010   01111001   00100000   01110110   01101001   01100011   01110100   01101111   01110010
01111001   00100000   01100111   01100001   01101001   01101110   01100101   01100100   00100000   01111001   01101111
01110101   00100000   01110111   01101001   01101100   01101100   00100000   01100001   01101100   01110011   01101111
00100000   01110011   01110101   01100110   01100110   01100101   01110010   00100000   01100001   00100000   01100100
01100101   01100110   01100101   01100001   01110100   00101110   00100000   00001101   00001010   00100000   00100000
00100000   00100000   01001001   01100110   00100000   01111001   01101111   01110101   00100000   01101011   01101110
01101111
01110100   8桁に区切ってみる
           01110111
           01101000
                      00100000
                      01100101
                                 01101110
                                 00100000
                                            01100101
                                            01100101
                                                       01101001
                                                       01101110
                                                                  01110100
                                                                  01100101
                                                                             01101000
                                                                             01101101
                                                                                        01100101
                                                                                        01111001
                                                                                                   01110010
                                                                                                   00100000
                                                                                                              00100000
                                                                                                              01101110
01101111   01110010   00100000   01111001   01101111   01110101   01110010   01110011   01100101   01101100   01100110
00101100   00100000   01111001   01101111   01110101   00100000   01110111   01101001   01101100   01101100   00001101
00001010   00100000   00100000   00100000   00100000   01110011   01110101   01100011   01100011   01110101   01101101
01100010   00100000   01101001   01101110   00100000   01100101   01110110   01100101   01110010   01111001   00100000
01100010   01100001   01110100   01110100   01101100   01100101   00101110   00001101   00001010
00110111


八つの 0/1 の並び方は、
全部で256通りある
49 56 46 32 72 101 110 99 101 32 116 104 101 32 115 97 121 105 110 103 58 32
32 73 102 32 121 111 117 32 107 110 111 119 32 116 104 101 32 101 110 101
109 121 13 10 32 32 32 32 97 110 100 32 107 110 111 119 32 121 111 117 114
115 101 108 102 44 32 121 111 117 32 110 101 101 100 32 110 111 116 32 102
101 97 114 32 116 104 101 32 114 101 115 117 108 116 32 111 102 32 97 13 10
32 32 32 32 104 117 110 100 114 101 100 32 98 97 116 116 108 101 115 46 32
32 73 102 32 121 111 117 32 107 110 111 119 32 121 111 117 114 115 101 108
102 32 98 117 116 32 110 111 116 32 116 104 101 32 101 110 101 109 121 44 13
10 32 32 32 32 102 111 114 32 101 118 101 114 121 32 118 105 99 116 111 114
121 32 103 97 105 110 101 100 32 121 111 117 32 119 105 108 108 32 97 108
115 111 32 115 117 102 102 101 114 32 97 32 100 101 102 101 97 116 46 32 13
10 32 32 32 32 73 102 32 121 111 117 32 107 110 111 119 32 110 101 105 116
104 101 114 32 116 104 101 32 101 110 101 109 121 32 110 111 114 32 121 111
117 114 115 101 108 102 44 32 121 111 117 32 119 105 108 108 13 10 32 32 32
32 115 117 99 99 117 109 98 32 105 110 32 101 118 101 114 121 32 98 97 116
116 108 101 46 13 10



                     さっきの8桁づつを、
                     対応する数字に直す
ASCII表

 という変換ルール




0~31は制御文字。
たとえば10とか13は
改行をあらわす
18. Hence the saying: If you know the enemy
    and know yourself, you need not fear the result of a
    hundred battles. If you know yourself but not the enemy,
    for every victory gained you will also suffer a defeat.
    If you know neither the enemy nor yourself, you will
    succumb in every battle.




            故に曰わく、彼れを知りて己れを知れば、百戦して殆うからず。彼れを知
            らずし て己れを知れば、一勝一負す。彼れを知らず己れを知らざれば、
            戦う毎に必らず殆うし。 (岩波文庫『孫子の兵法』から引用)


            英文は、『Project Gutenberg』 より
日本語の文字は、256通りでは
 表現できない。
 常用漢字だけでも 1,945文字



カナ ダケ ヲ ヒョウジ サセテ 256 トオリ ニ オシコンダ コトモ アッタケド
それじゃあ、0~256を二つあわせて
一文字ってことにすれば?

[49 56] [46 32] [72 101] [110 99] …
 山     本     哲    也    とかいった風に。

これなら 256の2乗 = 65,536 文字まで表せそう…


今まで書いてきたASCII文書との
互換性がなくなっちゃうからダメ
0~127 が来たらASCII、
128~255が来たら「次とあわせて」
日本語とみなす。

49 56 46 32 72 [201 220] 99 …
 a b c d e ^^^^^^^^
                 ここだけ日本語(1文字)

これなら、ASCII文字とその他の日本語も共存できそう。
ASCII文書に日本語を混ぜるための
具体的なルールが、
シフトJIS とか、EUC とか呼ばれるもの
。
エンコーディングともいう。

一種類で済んでいればよかったのに。
シフトJIS
0~127が来たら、ASCIIと同じ文字。
129~159 または 224~239 が来たら、
 次のデータをくっつけて日本語文字のどれかにあてる。
160~223は、半角カナというものにあてられる。
「あ」を表すデータは、130, 160。

EUC(日本語EUC)
0~127が来たら、ASCIIと同じ文字。
160~255が来たら、次のデータをくっつけて日本語文字の
 どれかにあてる。
143が来たら、次のデータは半角カナという目印。
「あ」を表すデータは、164, 162。
シフトJIS で書いたつもりのファイルを
  EUCと間違えて解読したら…

13 10 32 32 137 186 139   シフトJISかな?
76 130 204 151 118 151
204 130 201 130 168 130
162 130 196 129 67 13
10 129 117 144 125 143
145 138 217 144 69 136
                                      アタリ
245 139 179 136 231 131
118 131 141 131 79 131
137 131 128 40 73 84
140 164 143 67 41 129
118 130 240 13 10 142
192 142 123 130 162 130
189 130 181 130 220 130
183 129 66 13 10 13 10     EUCかな?
 13 10




                                      ハズレ
「エンコーディング」と、「文字セット」
という概念

       使える文字一覧(文字セット)※符号化文字集合とも言うんだって




                   これらの文字からチョイスして、
  abcABC           データの並びに落とすルールが
                   エンコーディング
  012345
  亜阿唖…

              本 日 は 晴 天 な り …
              13 10 32 32 137 186 139 76 130 204 151 …
文字セットとして主に知っているべきもの

JIS(JISX0208、6897字)
制定後に多少の変動があったが、最終バージョンではこれ?
JIS第一水準とか第二水準とか。日本語専用。記号含む。
区点コードという背番号を文字に振っている

UNICODE
世界中のすべての文字を収録することにした。何万字?
シフトJIS とか EUC は、この文字セットをエンコードできない。
UTF-8というエンコーディングがこれを扱える。
UTF-8
UNICODEが扱えて、しかもASCII文書と互換性がある。

0~127が来たら、ASCIIと同じ文字。
192~223が来たら、次のデータとあわせて一文字分。
224~239が来たら、次と次のデータをあわせて一文字分。

「あ」を表すデータは、227, 129, 130。
(たった一文字で3バイトか…)
使っている文字セットと
エンコーディングさえわかれば、
テキストファイルは必ず読める。


わからなくても、ある程度推定はできる
機種依存文字・外字
JISで決めているのは6897文字、シフトJISで表現できる
文字数は、実はこれより数百文字多い。(EUCも)

→ JISで漏れた文字とかも、うちの製品では
  サービスで混ぜてあげよう。きっと便利だよ。
例:
機種依存文字・外字(2)
→ 独自の文字を作る機能をつけてあげたら?
  どうせ枠があまってるんだから、活用活用。
例:
結果:
文書を書いたそのコンピュータ上でないと
、完全な文書が読めない

→将来にわたって読めるという保証が
  なくなるおそれ
  せっかくテキストファイルなのに。

機種依存文字や外字には注意。
テキストファイルと一般的なワープロ
ソフトで作った文書ファイルについて

一般的なワープロソフト…
  Microsoft Word?
  JUSTシステム 一太郎?
  富士通 OASIS?

共通点:テキストだけでなく、書式なども指定できる。
      図形やイラストも混在できる。
      レイアウト機能が充実している。
      ソフトごとに、様々なセールスポイント。
      頻繁なバージョンアップ。
ワープロと違って、テキストファイルだけ
を扱うソフトを、エディタという

メモ帳
秀丸エディタ
TeraPad
vi
などなど。

特徴:
文字の大きさや色を変えた文書は作れない
基本的に、どのソフトでも互いに文書をやりとりできる
ワープロで作った文書ファイルは、
テキストファイルとして見られるか?

特に意識しない限り、そのワープロソフトでしか
認識できない特殊な形式でファイルに保存する。
これを読むためのルールは一般利用者には
知らされない、または簡単には理解できないのが普通。

開発した会社が勝手にルールを変えちゃう権利もある
Wordで文書作って…
メモ帳で読み込んでみた
テキストファイル形式の
保存に対応している
謎の引継ぎ文書
謎の添付ファイル
解決法…

・ 印刷&FAX
・ 必ず同じソフトを使わせる
・ 文字だけなら、テキスト化

・ PDFに変換してしまうのも可
  (あとで編集するのは難しいが)
PDFは正確にはテキストファイルではないが、
仕様がはっきり公開されている。
これに沿ったプログラムさえ作れば、読める。
補足的なルールを持ったテキストファイル

・ ◆

・ HTML

・ CSV

・ XML

etc.
その他の話題

・ TAB記号

・ 全角スペース・全角英数字

・ 保存する媒体

・ 「みんなが読めない文書」を望む人も
  いるのでは?
etc.

More Related Content

テキストファイルの話