web-dev-qa-db-ja.com

Unicodeではなく日本語固有のエンコーディングを使用するようになったのはどのような問題ですか?

仕事で、Shift-JISやその他のエンコーディングの日本語テキストファイルをたくさん見つけました。すべてのコンピュータユーザーに mojibake (判読できない文字)の問題を引き起こします。 Unicodeは、すべての言語に対して単一の文字セットを定義することでこの種の問題を解決することを目的としており、インターネットでの使用にはUTF-8シリアル化が推奨されています。それでは、なぜ誰もが日本語固有のエンコーディングからUTF-8に切り替えないのですか? UTF-8のどのような問題または不利な点が人々を妨げていますか?

編集:W3Cはいくつかの nicodeの既知の問題 をリストしていますが、これも理由でしょうか?

24
Nicolas Raoul

一言で言えば、レガシー。

Unicodeが利用可能/普及する前に、Shift-JISやその他のエンコーディングが使用されていました。企業はShift-JISのみをサポートするインフラストラクチャに投資しています。そのインフラストラクチャがUnicodeをサポートするようになったとしても、it-works-so-don't-touch-it以上encoding-what? to migrating-all-existing-documents-is-too-costlyに。

同じ理由で、まだASCIIまたはlatin-1を使用している西側の会社はたくさんあります。問題を引き起こしたことはないので、誰も気づかないだけです。

28
deceze

私が覚えている理由は、UTF-8または別のUnicode表現を、主に日本で開発されているスクリプト言語Rubyのデフォルトの文字エンコーディングにしないことでした。

  • 理由1:ハン統合。中国、韓国、日本が使用している文字セット(ここでは「アルファベット」が正しいかどうかは不明)はすべて関連しているため、共通の歴史から発展し、詳細は不明です。 Unicodeコンソーシアムは、3つの言語すべてで外観が異なる場合でも、歴史的に同じ文字のすべてのバリアント(中国語、日本語、韓国語)をエンコードするために、単一のUnicodeコードポイントのみを浪費することを決定しました。彼らの推論は、外観はテキストを表示するために使用されるフォントによって決定されるべきであるということです。

どうやら、この推論は、ラテン系のアルファベットがギリシャ語のアルファベットから発展したため、ギリシャ語のアルファの単一のコードポイントがあれば十分であると英語の読者に主張するのと同じくらい、日本のユーザーによってばかげていると認識されています。 α」とラテン語「a」、使用するフォントで見た目を決めましょう。 ( "β" = "b"、 "γ" = "g"などにも同じ)

(もしそうなら、ここでstackexchangeにギリシャ文字を含めることができないことに注意してください。)

  • 理由2:非効率的な文字変換 Unicodeからレガシー日本語エンコーディングに文字を変換したり、元に戻したりするには、テーブルが必要です。つまり、Unicodeコードポイント値からレガシーコードポイント値へ、またはその逆の単純な計算はありません。また、1つのエンコーディングのすべてのコードポイントが他のエンコーディングで一意の表現を持っているわけではないため、変換時に情報の一部が失われます。

私がもう覚えていないより多くの理由が与えられたかもしれません。

9
Ludwig Schulze

deceze's answer はそれに対して非常に強力な真実の要素を持っていますが、Shift-JISやその他がまだ使用されている別の理由があります。 。 Shift-JISはIIRCであり、2バイト幅のエンコーディングですが、UTF-8はCJKなどのエンコーディングでは通常3バイト、場合によっては4バイトです。

主な理由の中で文字列サイズ/メモリ使用量を数えます。

UTF-8では、東アジア言語の文字に3バイト以上が必要になることがよくあります。平均して、UTF-16を使用する場合よりも 50%多いメモリ が必要です-後者は、ネイティブエンコーディングよりも効率が低くなっています。

他の主な理由は、だまし絵で指摘されているように、遺産です。

2

他の人が言ったように、レガシーとストレージサイズですが、もう1つあります。カタカナ文字です。

Shift-JISでカタカナ文字を表すのに1バイトしかかからないので、カタカナを含む日本語テキストは1文字あたり2バイト未満(50/50の組み合わせでは1.5)で、Shift-JISはUTF-16(2バイト/ char)、UTF-8(3バイト/ char)よりもはるかに効率的です。

安いストレージはこれをはるかに小さな問題にしたはずですが、明らかにそうではありません。

2
azheglov