C#の文字列エンコーディングの問題

科学技術の公式ブログから森
http://www.cnsendblog.com/index.php/?p=272
GPSプラットフォーム、サイト構築、ソフトウェア開発、システム運用・保守、大規模な森林ネットワーク技術を見つけるために!
http://cnsendnet.taobao.com

 

C#の文字列エンコーディングの問題

A、ASCIIコード

私たちは、コンピュータ内部の、すべての情報が最終的にバイナリ文字列として表現されていることを知っています。各二進数字(ビット)は、二つの状態0と1を有し、従って8ビットバイト(バイト)と呼ばれる256個の状態を、組み合わせることができます。それは、1バイトの合計が0000万から11111111まで、各状態は、256個のシンボルであるシンボルに対応し、256個の異なる状態を表すために使用することができるされています。

前世紀の60年代、米国では、英語の文字とビットの間の関係を文字エンコーディングのセットを開発した均一な規制をしました。これは、まだ使用され、ASCIIコードと呼ばれています。ASCII符号化コードは、スペース「SPACE」として128文字の合計を提供する32(バイナリ00100000)であり、大文字A 65(バイナリ01000001)です。128個のシンボルだけがゼロ所定の最前1の均一後ろバイト7をとり、(32個の制御シンボルなどをプリントアウトすることができません)。
あなたはASCIIコードの文字が数字で表示したい場合はC#では、あなたはクラスが文字エンコーディングを表しエンコーディングを使用することができ、コードは次の通りれる:
文字列S =「A」;
バイト[] = ASCII Encoding.ASCII.GetBytes(S);
私たちは、ASCIIコード97(1100001)を言うことである、デバッガのASCII 97で見ることができます

第二に、コーディング非ASCII

128シンボル十分をコードするが、他の言語を表すためと英語は、128シンボルでは十分ではありません。たとえば、フランス語で、文字以上の発音記号があり、それはASCIIコードで表現することはできません。その結果、一部の欧州諸国は、新しいシンボルに組み込まれたアイドルの最上位バイトを使用することにしました。例えば、フランス語のEは130(バイナリ10000010)として符号化されました。その結果、欧州諸国で使用される符号化システムは、256個のシンボルまで表すことができます。

しかし、ここで再び、新たな問題があります。異なる国、異なる文字を持っているので、彼らはエンコード256個の記号を使用している場合でも、文字が表す同じではありません。例えば、それは手紙ギメルを表しエンコードするヘブライ語で、éコーディングフランス語で130人の代表は、ロシアの符号化で別のに代わって署名します。しかし、いずれにしても、すべてのこれらのコード、記号は0〜127が同じで表し、この期間と同じではありませんが唯一128-255です。

テキストのアジア諸国については、シンボルが多く億10として漢字として、さらに使用しました。バイトは記号のみの256種類を表すことができ、それはあなたがシンボルを表現する複数のバイトを使用する必要があり、確かに十分ではありません。たとえば、簡体字中国語エンコーディングので理論的には256×256 = 65536シンボルまで表し、文字の2つのバイトを使用して、一般的GB2312です。:C#では、あなたはGB2312エンコードされた文字は、次のコードを使用して確認したい場合は
、文字列= S "ビーム"
System.Text.Encoding 2312 = System.Text.Encoding.GetEncoding( "GB2312");
バイト[] GB = GB2312.GetBytes(S);
この場合、二つの数が193(11000001)GBあり、186(10111010)

三、Unicode

逆さまに述べたように、二進数で、世界をコードする様々な異なるシンボルとして解釈することができるあります。そのため、テキストファイルを開くために、あなたはエンコーディングを知っているか、間違ったエンコーディングを読み込む必要があり、文字化けします。なぜ電子メールは、多くの場合、文字化け?送信者と受信者の使用をコードする同じではありませんので。

コードがある場合は、世界のすべてのシンボルが含まれている、想像してみてください。各シンボルは、ゴミ問題が消え、固有のコードを与えています。これは、その名が述べたように、これはすべてのエンコードはシンボルであり、Unicodeです。

Unicodeは確かに百万人以上のシンボルを収容することができ、その現在のサイズの大きなコレクションです。各シンボルを符号化することは異なっています。あなたは、Unicode文字を表示する場合はC#の次のコード使用して符号化することができる:
文字列= S「ビーム」;
バイト[] = Encoding.Unicode.GetBytesユニコード(S);
この場合、2つのユニコード番号129(10000001があります)、104(1101000)

四、Unicodeの問題

これは、Unicodeが、それが唯一のバイナリ表記を提供していますが、これはバイナリコードに格納する方法を指定しません、記号のセットだけで、注意すべきです。

例えば、このシンボルによって表される「ビーム」であるUnicode文字(110100010000001)は、少なくとも2つのバイトを必要とします。他の記号は、3バイトまたは4バイト、またはそれ以上を必要とするかもしれない、より大きな表します。

ここでは、2つの深刻な問題は、最初の質問は、どのように我々はUnicodeとASCIIを区別することができているがありますか?コンピュータは、3つのシンボルがそれを表しているのではなく、3バイトのシンボルを表す方法を知っていますか?第二の問題は、1バイトのみで十分である文字は、Unicodeの統一規制場合、各記号は3または4バイトで表現され、各文字の前に2のためにバインドされている、我々はすでに知っているということです3つのバイトに記憶するための膨大な廃棄物であり、0であり、テキストファイルのサイズが大きくなり、したがって、2〜3倍に、これは受け入れられません。

それらが引き起こす結果:1)ストレージ・ユニコードの種々の出現は、多くの異なるバイナリフォーマットが存在することは、ユニコードを表すために使用することができます。2)Unicodeは、インターネットの登場まで、時間の長い期間を促進することはできません。

五、UTF-8

インターネットの普及は、統一されたコーディングが表示されますを促しました。UTF-8は、インターネット上でUnicodeを使用して最も広く使用されている実装です。他の実装も、UTF-16、UTF-32が、インターネット上での基本的な必要性が含まれます。繰り返しますが、ここでは関係がUTF-8 Unicodeは、実装の一つである、です。

UTF-8の最大の特徴は、可変長符号化であるということです。これは、バイト長がシンボルによって異なり、一つのシンボルの1〜4バイトであることができます。

UTF-8エンコーディング規則は、2つだけの非常にシンプルです。

1)単一バイトシンボルに対して、バイト0のセット、Unicodeにシンボルコードのバック7。そのため、英語のアルファベットのため、UTF-8エンコーディングとASCIIコードは同じです。

2)シンボルnバイトを(N> 1)、最初のバイトの最初のnビットが1に設定され、N + 1ビットは、リアセット10の最初の2バイト均一に、0に設定されています。残りのビットは、全てこのUnicodeコードシンボルを言及していません。

 

UnicodeのUTF-8との間の変換

UCS-2 エンコード

UTF-8 バイトストリーム

U-00000000 - U-0000007F:

0xxxxxxx

U-00000080 - U-000007FF:

110xxxxx 10xxxxxxに

U-00000800 - U-0000FFFF:

1110xxxx 10xxxxxxに10xxxxxxに

U-00010000 - U-001FFFFF:

11110xxx 10xxxxxxに10xxxxxxに10xxxxxxに

U-00200000 - U-03FFFFFF:

111110xx 10xxxxxxに10xxxxxxに10xxxxxxに10xxxxxxに

U-04000000 - U-7FFFFFFF:

1111110x 10xxxxxxに10xxxxxxに10xxxxxxに10xxxxxxに10xxxxxxに

 

 一例として
、我々は、コード使用
列s =「ビーム」;
バイト[] = Encoding.Unicode.GetBytesユニコード(S)。

バイト[] UTF8 = Encoding.UTF8.GetBytes(S );
デバッガを参照

データがハイからローに配置されているメモリに、104 68129にヘクス81進、すなわちユニコード「ビーム」6881進数で、バイナリは、110100010000001あります我々は、UTF-8エンコーディング「ビーム」形式バイト3すなわち「1110xxxx 10xxxxxxに10xxxxxxに」を必要とするように三列は、(800-FFFF)6881に属している必要があり、テーブルの上部に見出すことができます。その後、最後のビット「ビーム」スタートから、前に戻って、余分のビット0からxの形式で記入してください。図8は、230162129である10進数に変換しないことにより、このようにして得られた、UTF-8エンコーディング「ビーム」は、「111001101010001010000001」です。そして正確にUTF8上記の図では同じ値。

六は、C#UTF-8ターンGB2312
NETメモリ内の文字列は、テストプログラムは、コンソールアプリケーションに書き込まないので、自分が次に基づいてコードを書いてください、Unicodeのとおりです。

ストリング UTF8ToGb2312(文字列strの)
        { 
            文字列 gb2312info = ストリング.Empty。

            エンコーディングUTF8 = Encoding.UTF8。
            エンコーディングGB2312 = Encoding.GetEncoding(" 2312 " )。

            バイト [] unicodeBytes = utf8.GetBytes(STR)。

            バイト [] asciiBytes = Encoding.Convert(UTF8、GB2312、unicodeBytes)。


           
            CHAR [] asciiChars = 新しい CHAR [gb2312.GetCharCount(asciiBytes、0 、asciiBytes.Length)]。
            gb2312.GetChars(asciiBytes、0、asciiBytes.Length、asciiChars、0 ); 
            gb2312info = 新しい 文字列(asciiChars)。
            リターンgb2312info。
 
        }

七、UTF8の利点の
他のサイトへのオペレーティングシステムの言語で符号化されたアクセス2312は、あなたが言語パックをダウンロードする必要がある場合は、UTF8エンコーディングは、そのUTF8エンコーディングで汎用性のサイトのために良い選択である、普遍的な言語でありますしかし、UTF-8のデータよりも比較2312は、より少ない数を得ました。

八、ゴミ問題:

メモリ、ファイルや電子メールの文字列がある場合、あなたはスキームが使用されるエンコーディングされたかを知る必要があり、そうでない場合は、正しく解釈したり、ユーザーに表示することができません。符号化方式を使用しようと何の対応する符号化同等の価値が存在しない場合には、一般的に「?」小さな疑問符を示し、またはボックスを表示します。メモリ内のNETの文字列はUnicodeです、asp.netプログラムのデフォルトは、我々はいくつかの文字列を使用するときに文字化けUTF-8エンコーディングでありながら、私たちはまず、当社の判断は間違ってエンコーディングではありません説明しなければなりません

 

科学技術の公式ブログから森
http://www.cnsendblog.com/index.php/?p=272
GPSプラットフォーム、サイト構築、ソフトウェア開発、システム運用・保守、大規模な森林ネットワーク技術を見つけるために!
http://cnsendnet.taobao.com

おすすめ

転載: www.cnblogs.com/cnsend/p/12177374.html
おすすめ