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

Posted

技术标签:

【中文标题】如何在 c# 中将字符串从 utf8 转换(音译)为 ASCII(单字节)?【英文标题】:How to convert (transliterate) a string from utf8 to ASCII (single byte) in c#? 【发布时间】:2010-10-04 14:38:16 【问题描述】:

我有一个字符串对象

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

我正在尝试使用

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

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

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

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

【问题讨论】:

请注意,如果您想将重音字符替换为无重音字符,可以使用 str.Normalize(NormalizationForm.FormKD) 【参考方案1】:

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

看起来像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...嗯,至少我们这些在美国的人。 ;)

【讨论】:

感谢它完美运行。我只需要做一个小改动。编码编码器 = ASCIIEncoding.GetEncoding("us-ascii", new EncoderReplacementFallback(string.Empty), new DecoderExceptionFallback()); +1 表示 EncoderReplacementFallback - 我以前从未听说过。喜欢它。 EncoderReplacementFallback 带有问号是默认设置。在这种情况下,似乎需要“更好的有损”。当有损是不能容忍的(恕我直言,这应该是默认值)时,异常回退很有用。【参考方案2】:

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

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

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

【讨论】:

值得注意的是,如果字符串中包含ASCII不能表示的字符,转换后就不是同一个字符串了。根据 Encoding.Convert 的工作方式(我不知道),它可能会丢失这些字符或出现乱码。 其实我只是测试了一些场景,你说的是真的。你知道如何克服这个限制吗?例如,如果我有一个特殊的撇号用普通撇号替换它。【参考方案3】:

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

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;
        
    

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

【讨论】:

【参考方案4】:

根据上面 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)); 

【讨论】:

【参考方案5】:

如果您想要在许多编码中使用的字符的 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);

【讨论】:

以上是关于如何在 c# 中将字符串从 utf8 转换(音译)为 ASCII(单字节)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中将 E+ 数字从字符串转换为十进制? [复制]

如何在lua中将UTF8字节数组转换为字符串

如何在 mysql 或 php 中将 'u00e9' 转换为 utf8 字符?

如何在 C# 中将字符串转换为字节 []

如何在 C# 中将字符串转换为 UTF-8?

如何在 C# 中将 rtf 字符串转换为文本