2

UTF-8 へのエンコード変換に関して、Windows プラットフォーム間で奇妙な動作が発生しています。商標記号の文字 0x99 のような「拡張 ASCII」文字を含む文字列がある場合、次のコードを使用して Windows 7 で変換できます。

using System.Text;
...
string DefaultEncodedStr = <<Some string with Extended ASCII chars like 0x99 for TM>>
byte[] DefaultEncodedBytes = Encoding.Default.GetBytes(DefaultEncodedStr);
byte[] UTF8EncodedBytes = Encoding.Convert(Encoding.Default, Encoding.UTF8, DefaultEncodedBytes);
char[] UTF8Chars = new char[Encoding.UTF8.GetCharCount(UTF8EncodedBytes, 0, UTF8EncodedBytes.Length)];
UTF8.GetChars(UTF8EncodedBytes, 0, UTF8EncodedBytes.Length, UTF8Chars, 0);
string UTF8Str = new string(UTF8Chars); 

ただし、このコードは Windows Server 2008 R2 で最初の文字列を変換できません。「拡張 ASCII」文字が最終文字列にまだ存在しています。

ただし、このコードは Windows Server 2008 R2 でも機能します。

using System.Text;
...
string DefaultEncodedStr = <<Some string with Extended ASCII chars like 0x99 for TM>>
byte[] DefaultEncodedBytes = Encoding.Default.GetBytes(DefaultEncodedStr)
string UTF8Str = Encoding.UTF8.GetString(DefaultEncodedBytes); 

しかし、このコードは Windows 7 で文字列を変換できません!!

何を与える?同じカーネル ベース (Win7) を使用しているデスクトップ クラスとサーバー クラスの OS の間で異なる動作が見られるのはなぜですか? エンコーディング変換を適切に処理する方法を決定するために、ある種のプラットフォーム検出コードを含める必要がありますか??

4

1 に答える 1

6

.NET 文字列は Unicode 文字のシーケンスです。文字列がある場合

string s = "™";

この場合、文字列は Unicode U+2122 TRADE MARK SIGN 文字で構成されます。

したがって、同等に書くことができます

string s = "\u2122";

エンコーディングを使用して、この一連の文字を一連のバイトに変換できます。

1 つのエンコーディングは UTF-8 です。

byte[] bytes = Encoding.UTF8.GetBytes(s);
// bytes == { 0xE2, 0x84, 0xA2 }

別のエンコーディングは Windows-1252 です。

byte[] bytes = Encoding.GetEncoding("Windows-1252").GetBytes(s);
// bytes == { 0x99 }

したがって、Windows-1252 の文字列を表し、バイト 0x99 で構成される一連のバイトがある場合、次のように文字列にデコードできます。

string result = Encoding.GetEncoding("Windows-1252").GetString(bytes);
// result == "™"

Encoding.Defaultは、オペレーティング システムの既定のエンコードを返します。これは Windows-1252 かもしれませんが、そうである必要はありません。使用するエンコーディングは常に明示的に指定してください。

コンピュータごとに異なるエンコーディングをデフォルトとして使用できます。デフォルトのエンコーディングは、1 台のコンピュータで変更することもできます。したがって、あるコンピューターから別のコンピューターにストリーミングされたデータ、または同じコンピューターで異なる時間に取得されたデータは、正しく変換されない可能性があります。

以下も参照してください。

于 2013-03-27T22:33:03.970 に答える