.net 上的奇怪规范化

Weird Normalization on .net

我正在尝试使用 Form D 规范化一个字符串(使用 .net 标准 2.0),它在 Windows 机器上完美运行 运行ning。

    [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 上 运行 时,它 returns 两个字符串在规范化之前和之后都是“253,255”。这两个字节构成了单词 65533,它是 Unicode 替换字符,在编码出现问题时使用。那是我迷路的部分。

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

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

var original = "\u00e9";

没有文字,只有编码文字。

在与人或程序交流文本时,字节和字符编码都是必不可少的。

C# 编译器(像所有处理文本的程序一样,除了像 JSON 这样的特殊情况)必须知道输入文件使用哪种字符编码。你必须准确地告知它。默认值为 UTF-8,这是一个不错的选择,尤其是对于 C# 文件,这些文件在词法上是 Unicode 代码点的序列。

如果您在使用编辑器或 IDE 或文件传输时没有充分考虑这些要求,您可能使用了非预期的字符编码。

例如,“é”在保存为 Windows-1252 (0xE9) 但读取为 UTF-8(前导代码单元后应跟两个连续代码单元)时,将给出 � 以指示这种对读者的错误处理。

为了安全起见,请谨慎使用 UTF-8。