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 ^^)这样的伟大框架来完成. 解决方法
.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”在某种程度上讨论了默认转换行为背后的基本原理.总之,他们不想干扰依赖于此行为的遗留应用程序.但他们建议覆盖默认值. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |