我有一个包含以下字符的文件:à,è,ì,ò,ù - À。我需要做的是用普通字符替换那些字符,例如:à= 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�
使用我的代码,符号将被完全删除
答案 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版本提供的扩展方法。 快速解释:
代码:
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