5

エイリアンコーディングシステムに入力文字列があります。つまり、次のとおりです。 "\\U+1043\\U+1072\\U+1073\\U+1072\\U+1088\\U+1080\\U+1090\\U+1085\\U+1086\\U+1089\\U+1090\\U+1100"

そして、それをデフォルトのコードシステム(System.Text.Encoding.Default)にキャストしたい:

-       System.Text.Encoding.Default    {System.Text.SBCSCodePageEncoding}  System.Text.Encoding {System.Text.SBCSCodePageEncoding}
+       [System.Text.SBCSCodePageEncoding]  {System.Text.SBCSCodePageEncoding}  System.Text.SBCSCodePageEncoding
        BodyName    "koi8-r"    string
        CodePage    1251    int
+       DecoderFallback {System.Text.InternalDecoderBestFitFallback}    System.Text.DecoderFallback {System.Text.InternalDecoderBestFitFallback}
+       EncoderFallback {System.Text.InternalEncoderBestFitFallback}    System.Text.EncoderFallback {System.Text.InternalEncoderBestFitFallback}
        EncodingName    "Cyrillic (Windows)"    string
        HeaderName  "windows-1251"  string
        IsBrowserDisplay    true    bool
        IsBrowserSave   true    bool
        IsMailNewsDisplay   true    bool
        IsMailNewsSave  true    bool
        IsReadOnly  true    bool
        IsSingleByte    true    bool
        WebName "windows-1251"  string
        WindowsCodePage 1251    int

コードシステムとそれをキャストする方法をどのように決定できますか?

4

1 に答える 1

11

あなたの質問を本当に理解しているかどうかわかりません。

.NET では、文字列オブジェクトがある場合、さまざまなエンコーディングを気にする必要はありません。すべての .NET 文字列は同じエンコーディングを使用します: Unicode (より正確には: UTF-16)。

文字列オブジェクトをバイト シーケンスに変換する場合 (たとえば、テキスト ファイルに書き込む場合)、またはその逆の場合にのみ、さまざまなテキスト エンコーディングが有効になります。これについて話していると思います。バイト シーケンスをあるエンコーディングから別のエンコーディングに変換するには、次のように記述できます。

byte[] input = ReadInput(); // e.g. from a file
Encoding decoder = Encoding.GetEncoding("encoding of input");
string str = decoder.GetString(input);
Encoding encoder = Encoding.GetEncoding("encoding of output");
byte[] ouput = encoder.GetBytes(str);

もちろんencoding of input、 とencoding of outputを適切なエンコーディング名に置き換える必要があります。MSDN には、サポートされているすべてのエンコーディングのリストがあります

慣習によって、またはメタデータなどに基づいて、入力のエンコーディングを知る必要があります。未知のエンコーディングを確実に判断/推測することはできませんが、適用できるトリックとヒューリスティックがいくつかあります。テキスト ファイルのエンコーディング/コードページを検出する方法を参照してください。

編集:

"U+xxxx" は通常、特定の Unicode コード ポイント (Unicode 文字に割り当てられた番号) を参照する方法です。たとえば、文字 "A" (ラテン大文字の A) のコード ポイントは U+0041 です。

入力文字列は実際に " \\U+1043..." (バックスラッシュ、バックスラッシュ、大文字の U など) ですか、それともデバッガ ウィンドウなどでこのように表示されるだけですか? それが最初の場合、誰かがテキストのエンコード中に間違いを犯しました。おそらく、Unicode リテラルを書き込もうとして、誤って 2 番目のバックスラッシュを書き込んでバックスラッシュをエスケープしたためです ( Edit2:または、文字を意図的にエスケープした方法で保存して、 ASCII エンコードされたファイル/ストリーム/etc)。私の知る限り、.NET エンコーディング クラスはここでは役に立ちません。文字列を手動で解析する必要があります。

ところで、あなたの例の数字は奇妙です。標準表記では、「U+」の後の数字は 10 進数ではなく 16 進数です。しかし、コード ポイントを 16 進数として読み取ると、まったく関係のない文字体系 (ビルマ語、グルジア語のムヘドルリ語、ハングル字母語) の文字を参照します。ただし、これらはすべてキリル文字を指す 10 進数として読み取られます。

Edit3:\\U+xxxxそれを解析するには、フォーム( x は数字)の部分文字列を探しxxxx、 intnに変換し、そのコードポイント(Char.ConvertFromUtf32(n))で char を作成し、部分文字列全体をその char に置き換えます。

于 2012-11-29T12:15:45.447 に答える