替换C#中的字符(ascii)

时间:2011-03-28 13:25:59

标签: c# ascii

我有一个包含以下字符的文件:à,è,ì,ò,ù - À。我需要做的是用普通字符替换那些字符,例如:à= a,è= e等......这是我的代码到目前为止:

StreamWriter sw = new StreamWriter(@"C:/JoinerOutput.csv");
string path = @"C:/Joiner.csv";
string line = File.ReadAllText(path);

if (line.Contains("à"))
{
    string asAscii = Encoding.ASCII.GetString(Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding(Encoding.ASCII.EncodingName, new EncoderReplacementFallback("a"), new DecoderExceptionFallback()), Encoding.UTF8.GetBytes(line)));
    Console.WriteLine(asAscii);
    Console.ReadLine();

    sw.WriteLine(asAscii);
    sw.Flush();
}

基本上,这会在文件中搜索特定字符,并将其替换为另一个字符。我遇到的问题是我的if语句不起作用。我该如何解决这个问题?

这是输入文件的示例:

Dimàkàtso Mokgàlo
Màmà Ràtlàdi
Koos Nèl
Pàsèkà Modisè
Jèrèmiàh Morèmi
Khèthiwè Buthèlèzi
Tiànà Pillày
Viviàn Màswàngànyè
Thirèshàn Rèddy
Wàdè Cornèlius
ènos Nètshimbupfè

这是输出,如果使用:line = line.Replace('à','a'); :

Ch�rl�n� Kirst�n
M�m� R�tl�di
Koos N�l
P�s�k� Modis�
J�r�mi�h Mor�mi
Kh�thiw� Buth�l�zi
Ti�n� Pill�y
Vivi�n M�sw�ng�ny�
Thir�sh�n R�ddy
W�d� Corn�lius
�nos N�tshimbupf�

使用我的代码,符号将被完全删除

7 个答案:

答案 0 :(得分:18)

其他人评论过使用Unicode查找表来删除Diacritics。我快速进行了Google搜索,找到了this example。代码无耻地复制,(重新格式化),并在下面发布:

using System;
using System.Text;
using System.Globalization;

public static class Remove
{
    public static string RemoveDiacritics(string stIn)
    {
        string stFormD = stIn.Normalize(NormalizationForm.FormD);
        StringBuilder sb = new StringBuilder();

        for(int ich = 0; ich < stFormD.Length; ich++) {
            UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]);
            if(uc != UnicodeCategory.NonSpacingMark) {
                sb.Append(stFormD[ich]);
            }
        }

        return(sb.ToString().Normalize(NormalizationForm.FormC));
    }
}

因此,您的代码可以通过调用:

来清理输入
line = Remove.RemoveDiacritics(line);

答案 1 :(得分:10)

不知道它是否有用但是在内部工具中在led屏幕上写入消息我们有以下替换(我确信有更智能的方法可以使这个工作用于unicode表,但是这个一个足够用于这个小型内部工具):

        strMessage = Regex.Replace(strMessage, "[éèëêð]", "e");
        strMessage = Regex.Replace(strMessage, "[ÉÈËÊ]", "E");
        strMessage = Regex.Replace(strMessage, "[àâä]", "a");
        strMessage = Regex.Replace(strMessage, "[ÀÁÂÃÄÅ]", "A");
        strMessage = Regex.Replace(strMessage, "[àáâãäå]", "a");
        strMessage = Regex.Replace(strMessage, "[ÙÚÛÜ]", "U");
        strMessage = Regex.Replace(strMessage, "[ùúûüµ]", "u");
        strMessage = Regex.Replace(strMessage, "[òóôõöø]", "o");
        strMessage = Regex.Replace(strMessage, "[ÒÓÔÕÖØ]", "O");
        strMessage = Regex.Replace(strMessage, "[ìíîï]", "i");
        strMessage = Regex.Replace(strMessage, "[ÌÍÎÏ]", "I");
        strMessage = Regex.Replace(strMessage, "[š]", "s");
        strMessage = Regex.Replace(strMessage, "[Š]", "S");
        strMessage = Regex.Replace(strMessage, "[ñ]", "n");
        strMessage = Regex.Replace(strMessage, "[Ñ]", "N");
        strMessage = Regex.Replace(strMessage, "[ç]", "c");
        strMessage = Regex.Replace(strMessage, "[Ç]", "C");
        strMessage = Regex.Replace(strMessage, "[ÿ]", "y");
        strMessage = Regex.Replace(strMessage, "[Ÿ]", "Y");
        strMessage = Regex.Replace(strMessage, "[ž]", "z");
        strMessage = Regex.Replace(strMessage, "[Ž]", "Z");
        strMessage = Regex.Replace(strMessage, "[Ð]", "D");
        strMessage = Regex.Replace(strMessage, "[œ]", "oe");
        strMessage = Regex.Replace(strMessage, "[Œ]", "Oe");
        strMessage = Regex.Replace(strMessage, "[«»\u201C\u201D\u201E\u201F\u2033\u2036]", "\"");
        strMessage = Regex.Replace(strMessage, "[\u2026]", "...");

有一点需要注意的是,如果在大多数语言中,文本在这样的处理之后仍然可以理解,并不总是如此,并且经常会强迫读者参考句子的上下文以便能够理解它。如果你有选择的话,不是你想要的东西。


请注意,正确的解决方案是使用unicode表,将带有集成变音符号的字符替换为“组合变音符号”+字符形式,然后删除变音符号...

答案 2 :(得分:6)

我经常使用基于Dana版本提供的扩展方法。 快速解释:

  • 规范化以形成D将像è这样的字符分割为 e 和非间距`
  • 从此,删除了nospacing字符
  • 结果归一化为D(我不确定这是否是必要的)

代码:

using System.Linq;
using System.Text;
using System.Globalization;

// namespace here
public static class Utility
{
    public static string RemoveDiacritics(this string str)
    {
        if (str == null) return null;
        var chars =
            from c in str.Normalize(NormalizationForm.FormD).ToCharArray()
            let uc = CharUnicodeInfo.GetUnicodeCategory(c)
            where uc != UnicodeCategory.NonSpacingMark
            select c;

        var cleanStr = new string(chars.ToArray()).Normalize(NormalizationForm.FormC);

        return cleanStr;
    }
}

答案 3 :(得分:3)

为什么让事情变得复杂?

line = line.Replace('à', 'a');

<强>更新

File.ReadAllText的文档说:

  

此方法会自动尝试   检测基于文件的编码   字节顺序标记的存在。   编码格式为UTF-8和UTF-32   (big-endian和little-endian)   可以被发现。

     

使用ReadAllText(String,Encoding)   读取文件时方法过载   可能包含导入的文本,   因为无法识别的字符可能   无法正确阅读。

C:/Joiner.csv的编码是什么?也许您应该使用File.ReadAllText的其他重载来自己指定输入编码?

答案 4 :(得分:2)

以简单的方式做到这一点。下面的代码将仅用2行代码将所有特殊字符替换为ASCII字符。它给你的结果与Julien Roncaglia的解决方案相同。

byte[] bytes = System.Text.Encoding.GetEncoding("Cyrillic").GetBytes(inputText);
string outputText = System.Text.Encoding.ASCII.GetString(bytes);

答案 5 :(得分:1)

使用此:

     if (line.Contains(“OldChar”))
     {
        line = line.Replace(“OldChar”, “NewChar”);
     }

答案 6 :(得分:0)

听起来你想做的就是将扩展ASCII(8位)转换为ASCII(7位) - 所以搜索它可能会有所帮助。

我见过图书馆用其他语言处理这个问题,但是从来没有用C#做过,这看起来有点像启发:

Convert two ascii characters to their 'corresponding' one character extended ascii representation