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

时间:2016-08-20 09:46:04

标签: c# .net encoding ascii

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

(基于Nyerguds's comment中提出的问题。)

1 个答案:

答案 0 :(得分:1)

我们假设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(snippet)上运行此命令会得到以下结果:

ASCII兼容:

  • 阿拉伯语(864)
  • 阿拉伯语(ASMO 708)
  • 阿拉伯语(DOS)
  • 阿拉伯语(ISO)
  • 阿拉伯语(Mac)
  • 阿拉伯语(Windows)
  • 波罗的海(DOS)
  • 波罗的海(ISO)
  • 波罗的海(Windows)
  • 中欧(DOS)
  • 中欧(ISO)
  • 中欧(Mac)
  • 中欧(Windows)
  • 简体中文(EUC)
  • 简体中文(GB18030)
  • 简体中文(GB2312)
  • 简体中文(GB2312-80)
  • 简体中文(ISO-2022)
  • 简体中文(Mac)
  • 繁体中文(Big5)
  • 繁体中文(CNS)
  • 繁体中文(Eten)
  • 繁体中文(Mac)
  • 克罗地亚语(Mac)
  • 西里尔文(DOS)
  • 西里尔文(ISO)
  • 西里尔文(KOI8-R)
  • 西里尔文(KOI8-U)
  • 西里尔语(Mac)
  • 西里尔语(Windows)
  • 爱沙尼亚语(ISO)
  • 法语加拿大(DOS)
  • 希腊语(DOS)
  • 希腊语(ISO)
  • 希腊语(Mac)
  • 希腊语(Windows)
  • 希腊语,现代(DOS)
  • 希伯来语(DOS)
  • 希伯来语(ISO-Logical)
  • 希伯来语(ISO-Visual)
  • 希伯来语(Mac)
  • 希伯来语(Windows)
  • IBM5550台湾
  • 冰岛语(DOS)
  • 冰岛语(Mac)
  • ISCII Assamese
  • ISCII孟加拉语
  • ISCII Devanagari
  • ISCII Gujarati
  • ISCII Kannada
  • ISCII Malayalam
  • ISCII Oriya
  • ISCII旁遮普语
  • ISCII Tamil
  • ISCII Telugu
  • 日语(EUC)
  • 日语(JIS 0208-1990和0212-1990)
  • 日语(Mac)
  • 日语(Shift-JIS)
  • 韩国
  • 韩国语(EUC)
  • 韩国人(Johab)
  • 韩语(Mac)
  • 韩国Wansung
  • 拉丁语3(ISO)
  • 拉丁语9(ISO)
  • 北欧(DOS)
  • OEM Cyrillic
  • OEM多语言拉丁语I
  • OEM美国
  • 葡萄牙语(DOS)
  • 罗马尼亚语(Mac)
  • 台湾TCA
  • TeleText台湾
  • 泰语(Windows)
  • 土耳其语(DOS)
  • 土耳其语(ISO)
  • 土耳其语(Mac)
  • 土耳其语(Windows)
  • 乌克兰语(Mac)
  • Unicode(UTF-8)
  • US-ASCII
  • 越南语(Windows)
  • 王台湾
  • 西欧(DOS)
  • 西欧(ISO)
  • 西欧(Mac)
  • 西欧(Windows)

非ASCII兼容:

  • 简体中文(HZ)
  • 欧洲
  • 德语(IA5)
  • IBM EBCDIC(阿拉伯语)
  • IBM EBCDIC(Cyrillic Russian)
  • IBM EBCDIC(Cyrillic Serbian-Bulgarian)
  • IBM EBCDIC(丹麦 - 挪威)
  • IBM EBCDIC(丹麦 - 挪威 - 欧元区)
  • IBM EBCDIC(芬兰 - 瑞典)
  • IBM EBCDIC(芬兰 - 瑞典 - 欧元)
  • IBM EBCDIC(法国)
  • IBM EBCDIC(法国 - 欧元)
  • IBM EBCDIC(德国)
  • IBM EBCDIC(德国 - 欧元)
  • IBM EBCDIC(希腊现代)
  • IBM EBCDIC(希腊语)
  • IBM EBCDIC(希伯来语)
  • IBM EBCDIC(冰岛语)
  • IBM EBCDIC(冰岛语 - 欧元区)
  • IBM EBCDIC(国际)
  • IBM EBCDIC(国际 - 欧元)
  • IBM EBCDIC(意大利)
  • IBM EBCDIC(意大利 - 欧元)
  • IBM EBCDIC(日语片假名)
  • IBM EBCDIC(韩语扩展)
  • IBM EBCDIC(多种语言拉丁语-2)
  • IBM EBCDIC(西班牙)
  • IBM EBCDIC(西班牙 - 欧元)
  • IBM EBCDIC(泰语)
  • IBM EBCDIC(Turkish Latin-5)
  • IBM EBCDIC(土耳其语)
  • IBM EBCDIC(英国)
  • IBM EBCDIC(英国 - 欧元)
  • IBM EBCDIC(美国 - 加拿大)
  • IBM EBCDIC(美国 - 加拿大 - 欧元区)
  • IBM Latin-1
  • IBM Latin-1
  • ISO-6937
  • 日语(JIS)
  • 日语(JIS-Allow 1字节假名 - SO / SI)
  • 日语(JIS-Allow 1字节假名)
  • 韩国语(ISO)
  • 挪威语(IA5)
  • 瑞典语(IA5)
  • T.61
  • 泰语(Mac)
  • Unicode (UTF-16)
  • Unicode(Big-Endian)
  • Unicode(UTF-32 Big-Endian)
  • Unicode(UTF-32)
  • Unicode(UTF-7)
  • 西欧(IA5)