Csharp/C#教程:查找.NET中的哪些编码是ASCII兼容的分享


查找.NET中的哪些编码是ASCII兼容的

实际上是否有任何简单的方法可以找到.NET中的哪些编码与ASCII兼容?

(基于Nyerguds评论中提出的问题。)

我们假设ASCII的标准定义限制为128个字符(即最高有效位为0的字节值)。 Unicode的设计使其前128个代码点对应于它们的ASCII等价物。 由于.NET中char结构的数值对应于其Unicode代码点(代理除外),我们可以定义一个实用方法,如下所示:

 private static readonly byte[] asciiValues = Enumerable.Range(0, 128).Select(b => (byte)b).ToArray(); private static readonly string asciiChars = new string(asciiValues.Select(b => (char)b).ToArray()); public static bool IsAsciiCompatible(Encoding encoding) { try { return encoding.GetString(asciiValues).Equals(asciiChars, StringComparison.Ordinal) && encoding.GetBytes(asciiChars).SequenceEqual(asciiValues); } catch (ArgumentException) { // Encoding.GetString may throw DecoderFallbackException if a fallback occurred // and DecoderFallback is set to DecoderExceptionFallback. // Encoding.GetBytes may throw EncoderFallbackException if a fallback occurred // and EncoderFallback is set to EncoderExceptionFallback. // Both of these derive from ArgumentException. return false; } } 

然后我们可以枚举所有.NET编码,如下所示:

 var encodings = Encoding.GetEncodings().Select(e => e.GetEncoding()).ToList(); var asciiCompatible = encodings.Where(e => IsAsciiCompatible(e)).ToList(); var nonAsciiCompatbile = encodings.Except(asciiCompatible).ToList(); Console.WriteLine("ASCII compatible: "); foreach (var encodingName in asciiCompatible.Select(e => e.EncodingName).OrderBy(n => n)) Console.WriteLine("* " + encodingName); Console.WriteLine(); Console.WriteLine("Non-ASCII compatible: "); foreach (var encodingName in nonAsciiCompatbile.Select(e => e.EncodingName).OrderBy(n => n)) Console.WriteLine("* " + encodingName); 

请注意,此方法并不完全安全。 如果存在多字节编码,它执行连续字节或字符的花式映射 – 例如将0x61解码为'a' ,将0x62'b' (如ASCII中)但将0x6261" " – 那么此测试将给出错误结果。

在.NET Fiddle( 代码段 )上运行此命令会得到以下结果:

ASCII兼容:

非ASCII兼容:

上述就是C#学习教程:查找.NET中的哪些编码是ASCII兼容的分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1031205.html

(0)
上一篇 2022年1月13日
下一篇 2022年1月13日

精彩推荐