当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在c#中将字符串从utf8转换(音译)到ASCII(单字节)?》经验,为你挑选了4个好方法。

我有一个字符串对象

"有多个角色甚至特殊字符"

我正在尝试使用

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

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

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

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

Mark Bracket.. 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的字符......好吧,我们这些人至少在美国.;)



1> Mark Bracket..:

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

看起来像是经典的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的字符......好吧,我们这些人至少在美国.;)


谢谢它完美的工作.我只需做一个小改动.编码编码器= ASCIIEncoding.GetEncoding("us-ascii",新的EncoderReplacementFallback(string.Empty),new DecoderExceptionFallback());

2> Geo..:

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

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

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



3> Peter Drier..:

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

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> tonycoupland..:

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

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有