c#编码中的一件怪事

c#编码中的一件怪事,c#,encoding,C#,Encoding,我将字节数组转换为字符串,并将该字符串转换为字节数组。 这两个字节数组是不同的 详情如下: byte[] tmp = Encoding.ASCII.GetBytes(Encoding.ASCII.GetString(b)); 假设b是一个字节数组 b[0]=3,b[1]=188,b[2]=2//十进制 结果: tmp[0]=3,tmp[1]=63,tmp[2]=2 这就是我的问题,它怎么了?188超出了ASCII的范围。不在相应字符集中的字符通过设计被转置为“?”(您更愿意转置为“1/4”吗?

我将
字节数组
转换为
字符串
,并将该
字符串
转换为
字节数组
。 这两个字节数组是不同的

详情如下:

byte[] tmp = Encoding.ASCII.GetBytes(Encoding.ASCII.GetString(b));
假设b是一个字节数组

b[0]=3,b[1]=188,b[2]=2//十进制

结果:

tmp[0]=3,tmp[1]=63,tmp[2]=2


这就是我的问题,它怎么了?

188超出了ASCII的范围。不在相应字符集中的字符通过设计被转置为“?”(您更愿意转置为“1/4”吗?)

字符
188
未为ASCII定义。相反,您得到的是
63
,这是一个问号。

字符集的范围为1到127。您可以看到188不在此范围内,并转换为?(=ASC 63)。

并非每个字节序列都必须是特定编码的有效编码值序列

因此,对任意字节数组
b
进行
Encoding.ASCII.GetString(b)
的结果定义得很差。(对于任何其他编码,也可以是)


如果需要获取任意字节数组并获取字符序列,可能需要查看
Convert
类和。如果您不想这样做,请向我们解释原始问题。

ASCII仅为7位,因此其他问题无效

对于8位字符集,您应该查找(稍后定义为“ISO 8859-1”)或(通常与扩展ASCII混淆,但实际上并非如此)

您可以使用以下代码:

Encoding enc = Encoding.GetEncoding("iso-8859-1");
// For CP437, use Encoding.GetEncoding(437)
byte[] tmp = enc.GetBytes(enc.GetString(b));

188
不在ASCII(7位)的范围内,应使用以获取ANSI编码:

byte[] b = new byte[3]{ 3, 188, 2 };
byte[] tmp = Encoding.Default.GetBytes(Encoding.Default.GetString(b));

ASCII只有7位数据。您正在寻找ANSI或其他编码。我不建议使用
编码。默认值
,因为生成的
编码
取决于所使用机器的设置,因此可以更改。最好使用
Encoding.GetEncoding(codePage)
并提供准确的代码页。