我有一个字符串对象
“包含多个字符甚至特殊字符”
我正在尝试使用
UTF8Encoding utf8 = new UTF8Encoding();
ASCIIEncoding ascii = new ASCIIEncoding();
对象以便将该字符串转换为ascii。我可以请某人为这个简单的任务带来一些启示,那就是打猎我的下午。
编辑1: 我们想要完成的是摆脱一些特殊的字符撇号等特殊字符。我在下面发布的代码作为答案将不会处理。基本上
奥布莱恩将成为奥?布莱恩。其中'是特殊撇号之一
答案 0 :(得分:20)
这是对你的另一个问题的回应,看起来它已被删除......这一点仍然存在。
看起来像classic Unicode to ASCII issue。诀窍是找到 正在发生的事情。
.NET适用于Unicode,假设it's told it's Unicode开始(或默认保留)。
我的猜测是您的接收应用无法处理它。所以,我可能会将ASCIIEncoder with和EncoderReplacementFallback与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));
当然,在过去,我们只是循环并删除任何字符greater than 127 ......好吧,我们这些人至少在美国。 ;)
答案 1 :(得分:12)
我能够弄清楚。如果有人想知道下面对我有用的代码:
ASCIIEncoding ascii = new ASCIIEncoding();
byte[] byteArray = Encoding.UTF8.GetBytes(sOriginal);
byte[] asciiArray = Encoding.Convert(Encoding.UTF8, Encoding.ASCII, byteArray);
string finalString = ascii.GetString(asciiArray);
如果有更简单的方法,请告诉我。
答案 2 :(得分:7)
对于喜欢扩展方法的人来说,这个方法对我们来说很有用。
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;
}
}
}
(系统命名空间,因此我们的所有字符串都可以自动使用它。)
答案 3 :(得分:5)
基于Mark的上述答案(以及Geo的评论),我创建了一个双线版本来从字符串中删除所有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));
答案 4 :(得分:1)
如果您想要在许多编码中使用的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);