6

我有一个将配置文件返回到低级硬件设备的网络服务。这个设备的制造商告诉我他只支持这个配置文件的单字节字符集。

这个 wiki 页面上,我发现以下应该是单字节字符集:

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

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

根据这个,方法 Endoding.IsSingleByte 似乎不可靠

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

根据这个,方法 Encoding.GetMaxByteCount 也有一些相同的问题

请注意,GetMaxByteCount 考虑了先前解码器操作的潜在剩余代理。由于解码器的原因,将值 1 传递给该方法会检索 2 用于单字节编码,例如 ASCII。如果需要此信息,您的应用程序应使用 IsSingleByte 属性。

因此,我不确定要使用什么。

进一步阅读

4

2 回答 2

6

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

然而!只有当您直接使用编码器/解码器时,所有这些才有意义。如果您在 上使用操作Encoding,例如Encoding.GetBytes,那么所有这些都对您来说是抽象的,您将永远不需要知道。在这种情况下,只需使用就IsSingleByte可以了。

于 2012-09-21T08:46:10.980 回答
0

也许您应该使用MSDN 上 Encoding.Convert Method 页面中的示例

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

于 2012-09-21T08:45:30.737 回答