如何修复Encoding.ASCII.GetBytes的意外输出

Sta*_*dup 0 c#

我在Encoding.ASCII.GetBytes方法的输出中看到意外的字符(?)。

因此,我正在执行以下操作:

var stringBytes = Encoding.ASCII.GetBytes(myString);
Run Code Online (Sandbox Code Playgroud)

myString在哪里:

{
  "$id": "1",
  "Note": "<p><span style=\"font-family: &quot;Courier New&quot;;\">?aaaa</span> 
  <br></p>"
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我这样做:

var myString1 = System.Text.Encoding.Default.GetString(stringBytes)
Run Code Online (Sandbox Code Playgroud)

然后,myString1返回为:

{
  "$id": "1",
  "Note": "<p><span style=\"font-family: &quot;Courier New&quot;;\">? 
   aaaa</span><br></p>"
}
Run Code Online (Sandbox Code Playgroud)

请注意,在最后一次操作中,aaaa如何转换为?aaaa

有人可以告诉我我在这里想念的吗?谢谢。

Ale*_*kov 5

当您发现字符在0-127范围之外时,这是ASCII编码的预期行为,就像您的情况一样。要修复-切换到UTF8(因为它支持所有字符)或手动将0-127以外的所有字符编码为适合您的字符(对于JSON,您可以使用带有“ \ u”前缀的十六进制编码- "\ufeff"

由于某种原因,字符串“ aaaa”以BOM(0xFEFF)开头,您看不到它,但是它在那里,必须转换为“?” 通过ASCII编码。要查看字符代码,请选择一个字符串并将其打印为十六进制:

  ((int)(">aaaa"[1])).ToString("x")  // gives FEFF on your string of length 6
Run Code Online (Sandbox Code Playgroud)

请注意,文本中间的BOM(字节顺序标记)通常是一个错误,在这种情况下,构造HTML的代码很可能是串联文件或类似的东西。Unicode.org的指南- 文件中间的U + FEFF应该怎么做?

感谢KlausGütter提供的BOM常见问题解答链接,感谢Tom Blodget在文本中间突出显示BOM的问题。

  • @Stackedup不允许BOM将其制成文本数据类型。BOM是元数据而不是文本。 (2认同)