C# 查找.NET中哪些编码与ASCII兼容
实际上有没有简单的方法可以找到.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
(基于中提出的问题。)我们将假定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)和文本自动检测