C#char/byte编码相等

ant*_*ony 2 c# unicode encoding character-encoding

我有一些代码将字符串转储到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();
    }
Run Code Online (Sandbox Code Playgroud)

考虑两个字符串,每个字符串显示为"ë",但具有不同的编码.DumpString将产生以下输出:

ë:e(65)(08)
ë:ë(eb)

代码如下所示:

DumpString(string1);
DumpString(string2);
Run Code Online (Sandbox Code Playgroud)

如何使用System.Text.Encoding将string2转换为与string1等效的字节.

dan*_*n04 7

它们没有不同的编码.C#中的字符串总是UTF-16(因此,您不应该使用byte迭代字符串,因为您将丢失前8位).他们所拥有的是不同的规范化形式.

你的第一个字符串是"\ u0065\u0308":LATIN SMALL LETTER E + COMBINING DIAERESIS.这是分解形式(NFD).

第二个是"\ u00EB":LATIN SMALL LETTER E with DIAERESIS.这是预先组合的形式(NFC).

你可以用它们之间进行转换string.Normalize.