查找.NET中的哪些编码与ASCII兼容(基于Nyerguds评论中提出的问题。)我们假设ASCII的标准定义限制为128个字符(即最高有效位为0的字节值)。Unicode的设计使得前128个代码点对应于它们的ASCII等价物。由于.NET中char结构的数值对应于它们的Unicode代码点(代理项除外),我们可以定义这样一个实用方法:privatestaticreadonlybyte[]asciiValues=Enumerable.Range(0,128).Select(b=>(byte)b).ToArray();privatestaticreadonlystringasciiChars=newstring(asciiValues.Select(b=>(char)b).ToArray());publicstaticboolIsAsciiCompatible(Encodingencoding){try{returnencoding.GetString(asciiValues).Equals(asciiChars,StringComparison.Ordinal)&&encoding.GetBytes(asciiChars).SequenceEqual(asciiValues);}catch(ArgumentException){//如果回退发生//Encoding.GetString可能会抛出DecoderFallbackException并且DecoderFallback设置为DecoderExceptionFallback。//如果回退发生,Encoding.GetBytes可能会抛出EncoderFallbackException//并且EncoderFallback设置为EncoderExceptionFallback。//这两个都派生自ArgumentException。返回假;然后我们可以枚举所有.NET编码,如下所示:varencodings=Encoding.GetEncodings().Select(e=>e.GetEncoding()).ToList();变量ascii兼容=encodings.Where(e=>IsAsciiCompatible(e)).ToList();varnonAsciiCompatbile=encodings.Except(asciiCompatible).ToList();Console.WriteLine("ASCII兼容:");foreach(varencodingNameinasciiCompatible.Select(e=>e.EncodingName).OrderBy(n=>n))Console.WriteLine("*"+encodingName);控制台.WriteLine();Console.WriteLine("非ASCII兼容:");foreach(varencodingNameinnonAsciiCompatbile.Select(e=>e.EncodingName).OrderBy(n=>n))Console.WriteLine("*"+encodingName);请注意,如果存在多字节编码,此方法并不完全安全,它会对连续字节或字符进行奇特的映射-例如,将0x61解码为“a”,将0x62解码为“b”(如在ASCII中),但将0x6261解码为“”-那么这个测试会给出错误的结果。在.NETFiddle(代码片段)上运行这个命令会得到如下结果:ASCIICompatible:Non-ASCIICompatible:以上是C#学习教程:Findoutwhichencodingsin.NETareASCIICompatible分享所有内容,如果你有没有用过,需要多了解C#学习教程。希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
