如何用单字节字符编码?

时间:2012-09-21 07:42:39

标签: c# unicode encoding character-encoding ansi

我有一个web服务,它将配置文件返回给低级硬件设备。 该设备的制造商告诉我他只支持此配置文件的单字节字符。

On this wiki page我发现以下内容应该是单字节字符集:

  • ISO 8859
  • ISO / IEC 646(我找不到这个here
  • 各种Microsoft / IBM代码页

但是当我在这些字符集上调用Encoding.GetMaxByteCount(1)时,它总是返回2.

我还尝试了其他各种编码(例如IBM437),但GetMaxByteCount也为其他字符集返回2。

方法Endoding.IsSingleByte似乎不可靠according to this

  

您应该小心应用程序对其值的作用   IsSingleByte。关于编码将如何进行的假设可能仍然存在   是错的。例如,Windows-1252的值为true   Encoding.IsSingleByte,但Encoding.GetMaxByteCount(1)返回2.这   是因为该方法考虑了a的潜在剩余代理人   以前的解码器操作。

此外,Encoding.GetMaxByteCount方法存在一些相同的问题according to this

  

请注意,GetMaxByteCount会考虑潜在的剩余代理   先前的解码器操作。因为解码器,传递一个值   1的方​​法检索2用于单字节编码,例如   ASCII。如果是这样,您的应用程序应使用IsSingleByte属性   信息是必要的。

因此我不知道该怎么用。

Further reading

2 个答案:

答案 0 :(得分:6)

基本上,GetMaxByteCount会考虑在常规代码中可能永远不需要的边缘情况,特别是它对解码器和代理的说法。这里的要点是一些代码点被编码为代理对,在不幸的情况下可能意味着它跨越两个调用GetBytes() / GetChars(在编码器/上)解码器)。因此,实现可能理论上仍然缓冲单个字节/字符并等待处理,因此GetMaxByteCount需要警告这一点。

然而!所有这一切只有在您直接使用编码器/解码器时才有意义。如果您使用Encoding上的操作,例如Encoding.GetBytes,则所有这些操作都会从您中抽象出来,您永远不需要知道。在这种情况下,只需使用IsSingleByte即可。

答案 1 :(得分:0)

也许您应该使用Encoding.Convert Method page on MSDN

中的示例

Encoding.Convert方法应该提供ASCII编码的字符串。希望单字节..