如何在 C# 中将字符串从 utf8 转换(音译)为 ASCII(单字节)?
-
20-08-2019 - |
题
我有一个字符串对象
“具有多个字符,甚至特殊字符”
我正在尝试使用
UTF8Encoding utf8 = new UTF8Encoding();
ASCIIEncoding ascii = new ASCIIEncoding();
对象,以便将该字符串转换为 ascii。我可以请某人为这个简单的任务带来一些启发,那就是狩猎我的下午。
编辑1:我们想要完成的是摆脱特殊字符,例如一些特殊的 Windows 撇号。我在下面发布的作为答案的代码不会解决这个问题。基本上
奥布莱恩将成为奥布莱恩。其中 ' 是特殊撇号之一
解决方案
这是对你的另一个问题的回应,看起来它已被删除......这一点仍然成立。
看起来像一个 经典的 Unicode 到 ASCII 问题. 。诀窍是找到 在哪里 正在发生。
.NET 可以很好地处理 Unicode,假设 据说它是 Unicode 开始(或保留默认值)。
我的 猜测 是您的接收应用程序无法处理它。所以,我可能会使用 ASCII编码器 和 一个 编码器替换回退 与 String.Empty:
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;
}
}
}
(系统命名空间,以便它可以几乎自动为我们所有的字符串。)
根据马克的回答以上(与地理的评论)
,我创建了一个两个班轮版本从字符串中删除所有ASCII例外情况。各种供人寻找这个答案(像我一样)。
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);
不隶属于 StackOverflow