11

我有一个字符串对象

“具有多个字符甚至特殊字符”

我正在尝试使用

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

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

编辑 1:我们想要完成的是摆脱特殊字符,如一些特殊的 windows 撇号。我在下面发布的作为答案的代码不会解决这个问题。基本上

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

4

5 回答 5

20

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

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

.NET 与 Unicode 一起工作得很好,假设它被告知它是以 Unicode开头(或保留为默认值)。

我的猜测是您的接收应用程序无法处理它。所以,我可能会将ASCIIEncoder 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));

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

于 2009-01-31T00:34:28.780 回答
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);

让我知道是否有更简单的方法。

于 2009-01-31T00:25:33.477 回答
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;
        }
    }
}

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

于 2012-02-02T21:48:34.683 回答
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)); 
于 2014-03-28T09:33:45.837 回答
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);
于 2016-07-17T14:23:23.417 回答