如何在c#中将字符串从utf8转换(音译)为ASCII(单字节)?

我有一个字符串对象

“有多个角色甚至特殊字符”

我正在尝试使用

UTF8Encoding utf8 = new UTF8Encoding(); ASCIIEncoding ascii = new ASCIIEncoding(); 

对象,以便将该字符串转换为ascii。 我可以请某人为这个简单的任务带来一些启示,那就是打猎我的下午。

编辑1:我们要完成的是摆脱一些特殊的字符撇号等特殊字符。 我在下面发布的代码作为答案将不会处理。 基本上

奥布莱恩将成为奥?布莱恩。 其中’是特殊撇号之一

这是对你的另一个问题的回应,看起来它已被删除……这一点仍然存在。

看起来像是经典的Unicode到ASCII问题 。 诀窍是找到它发生的地方。

.NET可以正常使用Unicode,假设它以Unicode开头(或默认保留)。

我的猜测是你的接收应用程序无法处理它。 所以,我可能会使用带有String.Empty的EncoderReplacementFallback的ASCIIEncoder :

 using System.Text; string inputString = GetInput(); var encoder = ASCIIEncoding.GetEncoder(); encoder.Fallback = new EncoderReplacementFallback(string.Empty); byte[] bAsciiString = encoder.GetBytes(inputString); // Do something with bytes... // can write to a file as is File.WriteAllBytes(FILE_NAME, bAsciiString); // or turn back into a "clean" string string cleanString = ASCIIEncoding.GetString(bAsciiString); // since the offending bytes have been removed, can use default encoding as well Assert.AreEqual(cleanString, Default.GetString(bAsciiString)); 

当然,在过去,我们只是循环并删除任何大于127的字符……好吧,至少在美国我们这些人。 ;)

我弄清楚了。 如果有人想知道下面对我有用的代码:

 ASCIIEncoding ascii = new ASCIIEncoding(); byte[] byteArray = Encoding.UTF8.GetBytes(sOriginal); byte[] asciiArray = Encoding.Convert(Encoding.UTF8, Encoding.ASCII, byteArray); string finalString = ascii.GetString(asciiArray); 

如果有更简单的方法,请告诉我。

对于喜欢扩展方法的人来说,这个方法对我们有用。

 using System.Text; namespace System { public static class StringExtension { private static readonly ASCIIEncoding asciiEncoding = new ASCIIEncoding(); public static string ToAscii(this string dirty) { byte[] bytes = asciiEncoding.GetBytes(dirty); string clean = asciiEncoding.GetString(bytes); return clean; } } } 

(系统命名空间,因此它几乎可以自动用于我们所有的字符串。)

根据Mark上面的回答(以及Geo的评论),我创建了一个双线版本来从字符串中删除所有ASCIIexception情况。 为寻找这个答案的人提供(就像我一样)。

 using System.Text; // Create encoder with a replacing encoder fallback var encoder = ASCIIEncoding.GetEncoding("us-ascii", new EncoderReplacementFallback(string.Empty), new DecoderExceptionFallback()); string cleanString = encoder.GetString(encoder.GetBytes(dirtyString)); 

如果您想要在许多编码中使用的8位字符表示,这可能对您有所帮助。

您必须将变量targetEncoding更改为您想要的任何编码。

 Encoding targetEncoding = Encoding.GetEncoding(874); // Your target encoding Encoding utf8 = Encoding.UTF8; var stringBytes = utf8.GetBytes(Name); var stringTargetBytes = Encoding.Convert(utf8, targetEncoding, stringBytes); var ascii8BitRepresentAsCsString = Encoding.GetEncoding("Latin1").GetString(stringTargetBytes);