2010-10-08 36 views
2

我有一些代码来转储字符串到标准输出,以检查它们的编码,它看起来像这样:C#字符/字节编码平等

private void DumpString(string s) 
    { 
     System.Console.Write("{0}: ", s); 
     foreach (byte b in s) 
     { 
      System.Console.Write("{0}({1}) ", (char)b, b.ToString("x2")); 
     }  
     System.Console.WriteLine(); 
    } 

考虑两个字符串,其中的每一个显示为“E”,但不同的编码。 DumpString将产生以下的输出:

E:(65)(08)
E:(EB)

的代码看起来是这样的:

DumpString(string1); 
DumpString(string2); 

如何我可以使用System.Text.Encoding将string2转换为与string1相等的字节。

回答

7

它们没有不同的编码。 C#中的字符串总是UTF-16(因此,您不应该使用byte来遍历字符串,因为您将丢失前8位)。他们有什么不同normalization forms

您的第一个字符串是“\ u0065 \ u0308”:拉丁小写字母E +组合DIAERESIS。这是分解形式(NFD)形式。

第二个是“\ u00EB”:拉丁文小写字母E与DIAERESIS。这是预分解表单(NFC)。

你可以用string.Normalize将它们进行转换。