.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。
我正在尝试使用 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。