微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 如何使用单字节字符编码?

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

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

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

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

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

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

You should be careful in what your application does with the value for
IsSingleByte. An assumption of how an Encoding will proceed may still
be wrong. For example,Windows-1252 has a value of true for
Encoding.IsSingleByte,but Encoding.GetMaxByteCount(1) returns 2. This
is because the method considers potential leftover surrogates from a
prevIoUs decoder operation.

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

Note that GetMaxByteCount considers potential leftover surrogates from
a prevIoUs decoder operation. Because of the decoder,passing a value
of 1 to the method retrieves 2 for a single-byte encoding,such as
ASCII. Your application should use the IsSingleByte property if this
information is necessary.

因此,我不知道如何使用.

Further reading.

解决方法

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

然而!所有这一切只有在您直接使用编码器/解码器时才有意义.如果您正在使用Encoding上的操作,例如Encoding.GetBytes,那么所有这些都是从您身上抽象出来的,您将永远不需要知道.在这种情况下,只需使用IsSingleByte,你会没事的.

原文地址:https://www.jb51.cc/csharp/244429.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐