我在字符串中替换字符时遇到一个奇怪的问题...
我读了一个包含俄语文本的.txt文件,从俄语到英语(ru = en)的字母列表开始,我循环列表,我想用英文字符替换俄文字符。
问题是:我可以在调试中看到正确阅读俄语和正确阅读英语,但使用myWord = myWord.Replace(ruChar, enChar)
字符串不会被替换。
我的txt文件是UTF-8编码。
答案 0 :(得分:4)
String.Replace()将会非常低效,你必须为你想要替换的每个可能的西里尔字母调用它。改为使用词典(没有双关语)。例如:
private const string Cyrillic = "AaБбВвГг...";
private const string Latin = "A|a|B|b|V|v|G|g|...";
private Dictionary<char, string> mLookup;
public string Romanize(string russian) {
if (mLookup == null) {
mLookup = new Dictionary<char, string>();
var replace = Latin.Split('|');
for (int ix = 0; ix < Cyrillic.Length; ++ix) {
mLookup.Add(Cyrillic[ix], replace[ix]);
}
}
var buf = new StringBuilder(russian.Length);
foreach (char ch in russian) {
if (mLookup.ContainsKey(ch)) buf.Append(mLookup[ch]);
else buf.Append(ch);
}
return buf.ToString();
}
请注意拉丁语替换中的条形和Split()函数是如何必要的,因为有些西里尔字母的音译需要多个字母。关键思想是使用字典进行快速查找,使用字符串构建器进行快速字符串构建。
此United Nations document可能会有所帮助。
答案 1 :(得分:0)
如果这不起作用,请不要-1我,我只是猜测你必须要替换UTF-8英文字符串,例如:
string myWord = Encoding.UTF8.GetString(Encoding.ASCII.GetBytes(myWord));
myWord = myWord.Replace("слово", Encoding.UTF8.GetString(Encoding.ASCII.GetBytes("letter")));
我假设myWord是ASCII格式,因此第一行代码将其转换为UTF-8字符串,但如果它是UTF-8则将其保留。
第二行将英语单词转换为UTF-8,因此可以将其替换为俄语单词。
答案 2 :(得分:-1)
很奇怪
Console.WriteLine("слово".Replace("слово", "word")); // prints 'word'
按计划工作。也许是因为我将俄语设置为非unicode系统语言..