Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 查找.NET中哪些编码与ASCII兼容_C#_.net_Encoding_Ascii - Fatal编程技术网

C# 查找.NET中哪些编码与ASCII兼容

C# 查找.NET中哪些编码与ASCII兼容,c#,.net,encoding,ascii,C#,.net,Encoding,Ascii,实际上有没有简单的方法可以找到.NET中哪些编码是ASCII兼容的 (基于中提出的问题。)我们将假定ASCII的标准定义限制为128个字符(即,最高有效位为0的字节值)。Unicode的设计使得它的前128个代码点对应于它们的ASCII等价物。由于.NET中的char结构的数值对应于其Unicode代码点(代理项除外),因此我们可以定义如下实用程序方法: private static readonly byte[] asciiValues = Enumerable.Range(0, 1

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


(基于中提出的问题。)

我们将假定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兼容:

  • 阿拉伯文(864)
  • 阿拉伯文(ASMO 708)
  • 阿拉伯文(DOS)
  • 阿拉伯文(ISO)
  • 阿拉伯文(Mac)
  • 阿拉伯文(Windows)
  • 波罗的海(DOS)
  • 波罗的海(ISO)
  • 波罗的海(窗口)
  • 中欧(DOS)
  • 中欧(ISO)
  • 中欧(Mac)
  • 中欧(Windows)
  • 简体中文(EUC)
  • 简体中文(GB18030)
  • 简体中文(GB2312)
  • 简体中文(GB2312-80)
  • 简体中文(ISO-2022)
  • 简体中文(Mac)
  • 中国传统文化(Big5)
  • 中国传统文化(CNS)
  • 中国传统文化(Eten)
  • 中国传统文化(Mac)
  • 克罗地亚语(Mac)
  • 西里尔语(DOS)
  • 西里尔语(ISO)
  • 西里尔语(KOI8-R)
  • 西里尔语(KOI8-U)
  • 西里尔语(Mac)
  • 西里尔文(窗口)
  • 爱沙尼亚语(ISO)
  • 法裔加拿大人(DOS)
  • 希腊语(DOS)
  • 希腊文(ISO)
  • 希腊语(Mac)
  • 希腊语(窗口)
  • 希腊语,现代(DOS)
  • 希伯来语(DOS)
  • 希伯来语(ISO逻辑)
  • 希伯来语(ISO视觉)
  • 希伯来语(Mac)
  • 希伯来语(窗口)
  • IBM5550台湾
  • 冰岛语(DOS)
  • 冰岛语(Mac)
  • 阿萨姆岛
  • 孟加拉语
  • 伊斯基德瓦纳加里
  • 古吉拉特邦
  • 坎纳达岛
  • 马来亚拉姆岛
  • 三叶草
  • 旁遮普群岛
  • 泰米尔语
  • 泰卢固岛
  • 日语(EUC)
  • 日语(JIS 0208-1990和0212-1990)
  • 日语(Mac)
  • 日文(日文)
  • 韩国人
  • 韩语(EUC)
  • 韩语(Johab)
  • 韩语(Mac)
  • 韩国万盛
  • 拉丁语3(ISO)
  • 拉丁语9(ISO)
  • 北欧(DOS)
  • 原始设备制造商西里尔语
  • OEM多语言拉丁语I
  • OEM美国
  • 葡萄牙语(DOS)
  • 罗马尼亚语(Mac)
  • 台湾TCA
  • 台湾图文电视
  • 泰语(窗口)
  • 土耳其语(DOS)
  • 土耳其语(ISO)
  • 土耳其语(Mac)
  • 土耳其语(窗口)
  • 乌克兰语(Mac)
  • Unicode(UTF-8)
  • US-ASCII
  • 越南语(窗口)
  • 王台
  • 西欧(DOS)
  • 西欧(ISO)
  • 西欧(Mac)
  • 西欧(窗口)
非ASCII兼容:

  • 简体中文(HZ)
  • 欧罗巴
  • 德语(IA5)
  • 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(意大利-欧元)
  • IBM EBCDIC(日本片假名)
  • IBM EBCDIC(韩国扩展)
  • IBM EBCDIC(多语言拉丁语-2)
  • IBM EBCDIC(西班牙)
  • IBM EBCDIC(西班牙-欧元)
  • IBM EBCDIC(泰国)
  • IBM EBCDIC(土耳其语拉丁语-5)
  • IBM EBCDIC(土耳其)
  • IBM EBCDIC(英国)
  • IBM EBCDIC(英国-欧元)
  • IBM EBCDIC(美国-加拿大)
  • IBM EBCDIC(美国-加拿大-欧元)
  • IBM拉丁语-1
  • IBM拉丁语-1
  • ISO-6937
  • 日语(JIS)
  • 日语(JIS允许1字节假名-SO/SI)
  • 日语(JIS允许1字节假名)
  • 韩语(ISO)
  • 挪威语(IA5)
  • 瑞典语(IA5)
  • T.61
  • 泰语(Mac)
  • Unicode(UTF-16)
  • Unicode(大端)
  • Unicode(UTF-32大端码)
  • Unicode(UTF-32)
  • Unicode(UTF-7)
  • 西欧(IA5)

Downvoter:你意识到了吗?如果问题和答案有任何错误,你应该留下评论,让读者至少知道。这是so的祸根。它确实减少了参与度。非常好的解决方案。不过,有一件事:Encoding.GetString,如果Encoding对象使用选项进行初始化(参见
UTF8Encoding
UTF16Encoding
的构造函数),因此,用一个只返回False的try-catch来包围它总是更安全的。要捕获的异常是一个
ArgumentException
@nyrguds:很好的一点。我已经根据您的建议更新了代码。顺便说一句,我之所以需要它是为了与自动检测编码结合使用。如果您从用户配置的编码(如Win-1252)和文本自动检测