我有一些代码将字符串转储到stdout来检查它们的编码,它看起来像这样:
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();
}
考虑两个字符串,每个字符串显示为“ë”,但编码不同。 DumpString将产生以下输出:
ë:e(65)(08)
ë:ë(eb)
代码如下所示:
DumpString(string1);
DumpString(string2);
如何使用System.Text.Encoding将string2转换为与string1等效的字节。
答案 0 :(得分:7)
他们没有不同的编码。 C#中的字符串总是UTF-16(因此,您不应该使用byte
来迭代字符串,因为您将丢失前8位)。它们的含义不同normalization forms。
你的第一个字符串是“\ u0065 \ u0308”:LATIN SMALL LETTER E + COMBINING DIAERESIS。这是分解的形式(NFD)。
第二个是“\ u00EB”:LATIN SMALL LETTER E with DIAERESIS。这是预合成表单(NFC)。
您可以使用string.Normalize
进行转换。
答案 1 :(得分:4)
您正在寻找String.Normalize
method。