使用非ascii符号的UTF8 GetBytes()的奇怪行为

本文关键字:UTF8 ascii 符号 GetBytes | 更新日期: 2023-09-27 18:27:42

有人能看到这两个代码块之间的区别吗?

1:

Byte[] arInput = Encoding.UTF8.GetBytes(sInput);

2:

System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding(); 
Byte[] arInput = UTF8.GetBytes(sInput);

之后,我在System.IO.Stream中编写arInput,并在HttpWebRequest中将Stream发送到远程服务器。

出于某种原因,当我在sInput中传递非ascii字符时,当我使用第一组代码时,服务器会返回500个错误,但它对第二组代码很有效。我试图将true和false传递给UTF8Encoding()构造函数,但没有任何变化。

使用非ascii符号的UTF8 GetBytes()的奇怪行为

Encoding.UTF8new UTF8Encoding()之间的唯一区别是前者启用了BOM,但如果调用GetPreamble(),则重要,因此在调用GetBytes()时,完全没有区别。

我建议您使用两种编码的示例输入和输出进行更新。

示例:

Encoding enc = new UTF8Encoding();
string s = "abc";
Console.WriteLine("new UTF8Encoding(), preamble: {0}",
    BitConverter.ToString(enc.GetPreamble()));
Console.WriteLine("new UTF8Encoding(), payload: {0}",
    BitConverter.ToString(enc.GetBytes(s)));
enc = Encoding.UTF8;
Console.WriteLine("Encoding.UTF8, preamble: {0}",
    BitConverter.ToString(enc.GetPreamble()));
Console.WriteLine("Encoding.UTF8, payload: {0}",
    BitConverter.ToString(enc.GetBytes(s)));

其中写道:

new UTF8Encoding(), preamble:
new UTF8Encoding(), payload: 61-62-63
Encoding.UTF8, preamble: EF-BB-BF
Encoding.UTF8, payload: 61-62-63