2010-12-05 13 views

答えて

5

最初に投稿されましたWhat every developer should know about character encoding

テキストファイルに触れるコードを書く場合は、おそらくこれが必要です。

は(まだ)私たちのために、この問題を解決しない二つの重要な項目

1.Unicodeから始めましょう。

2.すべてのテキストファイルがエンコードされます。エンコードされていないファイルや「一般的な」エンコードなどはありません。 そして、これにコーダシルを付け加えることができます - ほとんどのアメリカ人は、これを考慮に入れずに得ることができます。大部分のエンコーディングスキームの最初の127バイトの文字は、同じ文字セット(より正確にはグリフと呼ばれます)にマップされるためです。そして、私たちは他の文字やアクセントなどを使わずにA-Zを使用するだけなので、私たちは行くことができます。しかし、2番目はHTMLファイルやXMLファイルで同じ前提を使用し、最初の127文字以外の文字があると、問題が始まります。

コンピュータ業界は、ディスク領域とメモリからプレミアムでスタートしました。 1文字の代わりに2バイトを使用するように提案した人は誰でも笑ったでしょう。実際には、バイトが8ビットとして最善の結果を出すことができて幸運であるか、または各文字に対して256ビット未満であった可能性があります。初期の段階で多くのキャラクタセット(またはコードページ)が開発されました。しかし、最初の127バイトがすべて同じで、2番目のコードブックが各セットに固有のコードページの標準セットを使用して、ほとんどの人と結んでしまった。

そして、アジアでは256文字では不十分だったため、128〜255の範囲の中にはDBCS(2バイト文字セット)と呼ばれるものがありました。 。これらのより高い範囲内の第1バイトの各値について、第2バイトは256文字のうちの1つを識別した。これにより合計128 * 256の追加文字が得られました。それはハックでしたが、メモリ使用量を最小限に抑えました。中国語、日本語、韓国語の各DBCSコードページがあります。

しばらくの間、これはうまくいきました。オペレーティングシステム、アプリケーションなどは、ほとんどが指定されたコードページを使用するように設定されていました。しかし、その後、インターネットが来た。アメリカのウェブサイト。ギリシャのXMLファイルを使用して、ロシアをブラウズしているユーザーにデータを表示します。ロシアでは、それぞれの国に基づいてデータが入力されており、パラダイムを破っています。

今日に転送してください。これを最もよく説明できる2つのファイル形式は、HTMLやXMLです。すべてのHTMLファイルとXMLファイルには、ヘッダメタデータに文字エンコーディングをオプションで設定できます。それが設定されていない場合、ほとんどのプログラムはUTF-8であると想定していますが、これは標準ではなく、普遍的ではありません。エンコーディングが指定されておらず、ファイルを読み込んでいるプログラムが間違っていると推測された場合、ファイルは誤読されます。

ポイント1 - ファイルを書き込むときにエンコードをオプションとして指定しないでください。必ずファイルに書き込んでください。常に。たとえファイルが1から127の範囲外の文字を含むことはないと誓っても

標準とそれが動作する方法で、多くの人々を獲得するため、UTF-8を見てみましょうトラブルのUTF-8は2つの理由で人気がありました。まず、最初の127文字の標準コードページと一致し、既存のHTMLとXMLのほとんどが一致します。 2つ目は、できるだけ少ないバイト数で設計されていて、設計時には多くのことが重要になり、多くの人がダイヤルアップモデムを使用していました。

UTF-8は、アジアのコードページのDBCSデザインから借りたものです。最初の128バイトはすべて1バイト文字の表現です。次の最も一般的なセットの場合、2番目の128バイトのブロックを使用して2バイトシーケンスを作成し、より多くの文字を与えます。しかし、待って、もっと多くのことがあります。あまり一般的ではないが、第2バイトのsersiesにつながる最初のバイトがある。それらはそれぞれ3番目のバイトにつながり、3つのバイトが文字を定義します。これは最大6バイトのシーケンスになります。 MBCS(マルチバイト文字セット)を使用すると、すべてのユニコード文字の等価を書くことができます。あなたが書いているものがあまり使われていない中国語のリストではないと仮定すると、より少ないバイトでそれを行います。

しかし、ここでは誰もがHTMLやXMLファイルを持っていて、うまく動作し、テキストエディタで開くことができます。次に、テキストエディタで地域のコードページを使用して、ßのような文字を挿入してファイルを保存する文字を追加します。もちろん、テキストエディタで正しく表示されている必要があります。しかし、それを2バイトシーケンスの最初の文字であるエンコーディングに従って読み込むプログラムにフィードしてください。別の文字を取得するか、2番目のバイトがその最初のバイトの正当な値でない場合、エラーが発生します。

ポイント2 - エンコードを使用して正しく書き出すプログラムでHTMLとXMLを作成します。テキストエディタで作成する必要がある場合は、ブラウザで最終ファイルを表示します。

ここで、あなたが書いているコードがファイルを読み書きするのはどうですか?私たちはバイナリ/データファイルを自分の書式で書き出すのではなく、テキストファイルと見なされるファイルについて話しています。 Java、.NETなどにはすべて文字エンコーダーがあります。これらのエンコーダーの目的は、一連のバイト(ファイル)とそれらが表す文字を変換することです。実際には非常に難しい例、つまりC#、Javaなどのソースコードを取り入れています。これらはまだ符号化のヒントを持たない大まかな「普通の古いテキストファイル」です。では、プログラムはどのようにそれらを処理しますか?多くの人は、ローカルコードページを使用していると仮定します。他の多くの人は、すべての文字が0〜127の範囲内にあり、他の文字を詰まらせると想定しています。

これらのテキストファイルについての重要な点は、すべてのプログラムがまだエンコーディングを使用していることです。コードで設定することはできませんが、定義上、エンコーディングが使用されています。

ポイント3 - テキストファイルを読み書きするときは、常にエンコードを設定します。 HTML & XMLだけでなく、ソースコードのようなファイルの場合でも。デフォルトのコードページを使用するように設定してエンコードを設定しても問題ありません。

ポイント4 - 可能な限り最も完全なエンコーダを使用してください。独自のXMLをUTF-8用にエンコードされたテキストファイルとして記述することができます。しかし、XMLエンコーダを使用して記述すると、エンコーディングがメタデータに含まれ、間違ってしまうことはありません。

[OK]を入力すると、&のファイルが正しく書き込まれますが、コードの内容は正しく表示されます。何それ?これは簡単です - ユニコードです。これが、Javaの& .NETランタイムで作成されたエンコーダの機能です。あなたは読んでユニコードを入手します。ユニコードを作成し、エンコードされたファイルを取得します。そのため、char型は16ビットで、文字用の固有のコア型です。これはあなたがおそらく正しいのですが、今日の言語はあなたに多くの選択肢を与えないからです。

ポイント5 - (しばらくしている言語の開発者向け) - 常にユニコードを内部的に使用してください。 C++では、これはワイド文字(または同様のもの)と呼ばれます。バイト数を節約するために賢明にならないでください。メモリは安く、もっと重要なことがあります。

私はここに心に留めておくための2つのキー項目があると思い

それをラッピング。まず、テキストファイルのアカウントにエンコードを取っていることを確認してください。第二に、これは実際にはすべて非常に簡単で簡単です。エンコーディングの使い方をめちゃくちゃにする人はほとんどいません。エンジニアが問題に遭遇することを無視するのです。

+0

ポイント5は、ご使用のプラットフォームによって異なります。 'wchar_t'とUTF-16はWindowsがUnicodeをどのようにしているのですが、UnixのようなシステムはUTF-8を好む傾向があります。 – dan04

関連する問題