加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#中严格的字符串到字节编码

发布时间:2020-12-16 01:38:34 所属栏目:百科 来源:网络整理
导读:我刚刚偶然发现 another question,有人建议使用新的ASCIIEncoding().GetBytes(someString)将字符串转换为字节.对我来说很明显,它不适用于非ASCII字符.但事实证明,ASCIIEncoding很高兴用’?’替换无效字符.我对此非常困惑,因为这种打破了最不惊讶的规则.在Py
我刚刚偶然发现 another question,有人建议使用新的ASCIIEncoding().GetBytes(someString)将字符串转换为字节.对我来说很明显,它不适用于非ASCII字符.但事实证明,ASCIIEncoding很高兴用’?’替换无效字符.我对此非常困惑,因为这种打破了最不惊讶的规则.在Python中,它将是“一些unicode字符串”.encode(“ascii”)并且默认情况下转换是严格的,因此非ASCII字符将导致此示例中的异常.

两个问题:

>如何将字符串严格转换为其他编码(如ASCII或Windows-1252),以便在出现无效字符时抛出异常?顺便说一句,我不希望foreach循环将每个Unicode数字转换为一个字节,然后检查第8位.这应该由像.NET(或Python ^^)这样的伟大框架来完成.
>有关此默认行为背后的理由的任何想法?对我来说,默认情况下进行严格转换或至少为此目的定义参数更有意义(Python允许“替换”,“忽略”,“严格”).

解决方法

.Net提供了在编码转换失败时抛出异常的选项.您需要使用 EncoderExceptionFallback类(如果输入字符无法转换为编码的输出字节序列,则抛出EncoderFallbackException)以创建编码.以下代码来自该类的文档:

Encoding ae = Encoding.GetEncoding(
              "us-ascii",new EncoderExceptionFallback(),new DecoderExceptionFallback());

然后使用该编码执行转换:

// The input string consists of the Unicode characters LEFT POINTING 
// DOUBLE ANGLE QUOTATION MARK (U+00AB),'X' (U+0058),and RIGHT POINTING 
// DOUBLE ANGLE QUOTATION MARK (U+00BB). 
// The encoding can only encode characters in the US-ASCII range of U+0000 
// through U+007F. Consequently,the characters bracketing the 'X' character
// cause an exception.

string inputString = "u00abXu00bb";
byte[] encodedBytes = new byte[ae.GetMaxByteCount(inputString.Length)];
int numberOfEncodedBytes = 0;
try
{
    numberOfEncodedBytes = ae.GetBytes(inputString,inputString.Length,encodedBytes,0);
}
catch (EncoderFallbackException e)
{
    Console.WriteLine("bad conversion");
}

MSDN page,“Character Encoding in the .NET Framework”在某种程度上讨论了默认转换行为背后的基本原理.总之,他们不想干扰依赖于此行为的遗留应用程序.但他们建议覆盖默认值.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读