Unicode 在.net上的奇怪规范化

Unicode 在.net上的奇怪规范化,unicode,encoding,.net-standard,.net-standard-2.0,unicode-normalization,Unicode,Encoding,.net Standard,.net Standard 2.0,Unicode Normalization,我正在尝试使用表单D规范化字符串(使用.net标准2.0),它可以完美地工作并在Windows机器上运行 [TestMethod] public void TestChars() { var original = "é"; var normalized = original.Normalize(NormalizationForm.FormD); var originalBytesCsv = stri

我正在尝试使用表单D规范化字符串(使用.net标准2.0),它可以完美地工作并在Windows机器上运行

    [TestMethod]
    public void TestChars()
    {            
        var original = "é";
        var normalized = original.Normalize(NormalizationForm.FormD);

        var originalBytesCsv = string.Join(',', Encoding.Unicode.GetBytes(original));
        Assert.AreEqual("233,0", originalBytesCsv);

        var normalizedBytesCsv = string.Join(',', Encoding.Unicode.GetBytes(normalized));
        Assert.AreEqual("101,0,1,3", normalizedBytesCsv);
    }
当我在Linux上运行它时,它会在规范化之前和之后为两个字符串返回“253255”。这两个字节构成了单词65533,它是Unicode替换字符,当编码出错时使用。这就是我迷路的地方


我错过了什么?有人给我指出正确的方向吗

它可能与源文件的编码有关。我不确定Linux上的.net支持哪些编码,但为了安全起见,您应该对非ASCII字符使用普通ASCII源文件和Unicode转义:

var original = "\u00e9";

这可能与源文件的编码有关。我不确定Linux上的.net支持哪些编码,但为了安全起见,您应该对非ASCII字符使用普通ASCII源文件和Unicode转义:

var original = "\u00e9";
没有文本,只有编码文本

在与人或程序进行文本通信时,字节和字符编码都是必不可少的

C#编译器(与所有处理文本的程序一样,JSON等特殊情况除外)必须知道输入文件使用哪个字符编码。你必须准确地通知它。默认值是UTF-8,这是一个很好的选择,特别是对于C#文件,从词汇上讲,C#文件是Unicode码点序列

如果使用编辑器、IDE或文件传输时没有完全注意这些要求,则可能使用了意外的字符编码

例如,“é”保存为Windows-1252(0xE9),但读取为UTF-8(前导代码单元,后跟两个连续代码单元),将给出� 向读者表明这种错误处理

为了安全起见,请在任何地方使用UTF-8,但要谨慎使用。

除了编码文本之外,没有文本

在与人或程序进行文本通信时,字节和字符编码都是必不可少的

C#编译器(与所有处理文本的程序一样,JSON等特殊情况除外)必须知道输入文件使用哪个字符编码。你必须准确地通知它。默认值是UTF-8,这是一个很好的选择,特别是对于C#文件,从词汇上讲,C#文件是Unicode码点序列

如果使用编辑器、IDE或文件传输时没有完全注意这些要求,则可能使用了意外的字符编码

例如,“é”保存为Windows-1252(0xE9),但读取为UTF-8(前导代码单元,后跟两个连续代码单元),将给出� 向读者表明这种错误处理


为了安全起见,在任何地方都可以使用UTF-8,但要小心使用。

可能与源文件的编码有关。
var original=“\u00e9”
会发生什么?这正是问题所在!我的文件使用Windows-1252编码。请回答下面的问题,这样我就可以标记正确的答案。也许这与源文件的编码有关。
var original=“\u00e9”
会发生什么?这正是问题所在!我的文件使用Windows-1252编码。请回答下面的问题,这样我就能把正确的答案标出来。