5/30/2017

Únicodeは難しい

Terence Edenのブログより。面白い。

数ヶ月前に、私はイギリスの領収書で記号úを見かけました。なぜ?

Receipts with a missing pound sign

1963 - ASCII

最初は*ASCIIでした。コンピュータがテキストを交換するための標準的な方法です。ASCIIは元々7ビットで設計されました。つまり、128の記号が可能なことを意味します。それは誰にとっても十分である筈ですよね?

間違っています! ASCIIはAmerican Code for Information Interchangeです。そこには$の記号は含まれていますが、他の通貨記号は何もありません。我々はアメリカ人ではないので、問題があります。

* ASCIIの起源は20世紀初頭の電信符号です。それらは19世紀のボーコードから派生したものです。

1981 - 拡張ASCII

そのため、ASCIIは徐々に8ビット言語に姿を変えました。それが問題の始まりでした。記号0-127はすでに標準化され、受け入れられていました。記号128-255はどうしたか?

世界中の通信に必要となる記号は非常に幅広いため、8ビット言語では256個の記号しかないため、コンピュータは「文字符号化方式(コードページ)」に依存し始めました。その考えは簡単で、ファイルの先頭にはドキュメントが書かれテイル言語を表すコードが含まれています。コンピュータは、その記号を使用して、使用する記号セットを決定します。

1981年、IBMが最初のパーソナルコンピュータを発売しました。英語の場合、コードページ437を使用しました。

それぞれ人が作ったスクリプト/アルファベットには独自のコードページが必要でした。例えば、ギリシア語は737を、切る理文字は855を使用します。つまり、どのコーディングが使われるかに応じて、同じコードを複数の異なる方法で表示されるわけです。

記号162、163、164がそれぞれのコードページでどう表示されるかを示します。

162 163 164
コードページ437 (Latin US) ó ú ñ
コードページ737 (ギリシア語) λ μ ν
コードページ855 (キリル語) б Б ц
コードページ667 (ポーランド語) ó Ó ñ
コードページ720 (アラビア語) ت ث ج
コードページ863 (フランス語) ó ú ¨

ご覧のように、使用するエンコーディングに応じて文字が表示されます。コンピュータがエンコーディングを間違えると、テキストは様々な言語の不可解なミックスになります。

これにより、コンピュータで作業するすべてのが人が非常に怒りました。

1983 - DEC

バカみたいです。同じコードが異なる記号を表すことはできません。非常に混乱します。そのため、1983年にDECはさらに別のエンコーディング標準Multinational Character Set(MCS)を導入しました。

DEC VT100で、イギリス英語キーボード選択は拡張ASCIIのポジション35(35+128=168)で£記号があります。これはあとで重要になります。

もちろん、DECからIBMにテキストを送信した場合、どのエンコーディングが使用されているかを正確に知らない限り、文字化けを起こします。

皆はそれでも怒りました。

1987

結局、ISOは一般的にはLatin-1として知られる8859-1を発表しました。

以前の標準のほとんどを取り上げ、いくらか論理的な順序でそれらを置くため、1ビット操作しました。コードページ437との比較の抜粋です。

162 163 164
コードページ437 (Latin US) ó ú ñ
ISO-8859-1 (Latin-1) ¢ £ ¤

8859-1は初めて256個の記号を定義し、そこから逸脱してはいけないとを宣言しました。MicrosoftはすぐさまWindows 1252エンコーディングで逸脱をしました。

あらゆる人がMicrosoftをひどく嫌います。

1991 - Unicode!

1990年代初頭、Unicodeが前のUniversal Coded Character Setから誕生しました。すべての人間のテキストをエンコードする標準的な方法を作成する試みです。既存の文書とのバックワード互換を維持するため、Unicodeの最初の256文字はISO 8859-1 (Latin 1)と同じです。

平和と繁栄の新しい時代が到来しました。今や誰もがUnicodeを使用します。民は民に平和を語るべし!(BBCの標語)

2017 - なぜこれはまだ整理されていないのか?

ここで何が起きているのでしょう。私が思うに、

  • レストラン経営者はレジを使って価格表を入力します
  • レジはUnicodeを使い、£記号は数値163として保持されています
  • レジがプリンタに接続します
  • レジはプリンタに一連の8ビットコードとしてテキストを送信します
  • プリンタはどのコードページを使用するか分かりません。そのため最善の推測をします
  • プリンタの製造元は最小公約数でコードページ437を代替することを決定しました
  • 163はúに変換されます
  • 顧客は混乱して、ブログを書きます

30以上経過しており、現代の領収書プリンタは依然としてIBMのコードページ437を使っています。死ぬことを拒否しているだけです!

今日でも、現代のWindowsマシンでは、Alt+163と入力するとデフォルトで437となりúと印字します。

非接触型のクレジットカードリーダにAndroid携帯をタップすると、私の命令することが天使のように空中を飛び、現代の世界全体がまだ古くて形の崩れた標準に支えられており、時折それがまだ隠されていることを私たちに知らせるために突然頭を出すことがあります。

ずっと下までカメです!

そうでしょうか?

もちろん、領収書全体を見ると、奇妙なことに気付くでしょう。

Receipt with both pound signs and u symbols

領収書のいくつかの部分では、£(ポンド)がうまく印刷されているのです!

⨈Һ𝘢ʈ ╤ћᘓ 𝔽ᵁʗꗪ❓ (全く! : What the fuck!)

Hacker News