C#中的字符串替换变音符号[重复]
Posted
技术标签:
【中文标题】C#中的字符串替换变音符号[重复]【英文标题】:String replace diacritics in C# [duplicate] 【发布时间】:2011-02-03 17:44:12 【问题描述】:我想使用this 方法来创建用户友好的URL。因为我的网站是克罗地亚语的,所以有些字符我不想去掉,而是用另一个替换它们。例如这个字符串:
ŠĐĆŽšđčćž
需要:
sdccz-sdccz
所以,我想创建两个数组,一个包含要替换的字符,另一个包含替换字符:
string[] character = "Š", "Đ", "Č", "Ć", "Ž", "š", "đ", "č", "ć", "ž" ;
string[] characterReplace = "s", "d", "c", "c", "z", "s", "d", "c", "c", "z" ;
最后,这两个数组应该用在某种方法中,该方法将获取字符串,查找匹配项并替换它们。在 php 中,我使用 preg_replace 函数来处理这个问题。在 C# 中这不起作用:
s = Regex.Replace(s, character, characterReplace);
如果有人可以提供帮助将不胜感激。
【问题讨论】:
见***.com/questions/2393887/… @ile 查看我的答案的编辑! 【参考方案1】:您似乎想去掉变音符号并留下基本字符。为此我推荐Ben Lings's solution:
string input = "ŠĐĆŽ šđčćž";
string decomposed = input.Normalize(NormalizationForm.FormD);
char[] filtered = decomposed
.Where(c => char.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
.ToArray();
string newString = new String(filtered);
编辑:小问题!它不适用于Đ。结果是:
SĐCZ sđccz
【讨论】:
我收到以下错误:'string' 不包含'Normalise' 的定义,并且找不到接受'string' 类型的第一个参数的扩展方法'Normalise'(您是否缺少使用指令还是程序集引用?) @ile: 显然我从中复制的解决方案中有错误。我现在已经修好了。不幸的是,尽管这种方法对 Đ 失败,所以要么你必须特别处理这种情况,要么按照你最初建议的方式去做。 我明白了...但这是一个非常简单的解决方案,我将使用它并使用特殊方法替换 Đ 和 đ。谢谢!【参考方案2】:乔恩·斯基特mentioned the following code on a newsgroup...
static string RemoveAccents (string input)
string normalized = input.Normalize(NormalizationForm.FormKD);
Encoding removal = Encoding.GetEncoding(Encoding.ASCII.CodePage,
new EncoderReplacementFallback(""),
new DecoderReplacementFallback(""));
byte[] bytes = removal.GetBytes(normalized);
return Encoding.ASCII.GetString(bytes);
编辑
也许我疯了,但我只是跑了以下......
Dim Input As String = "ŠĐĆŽ-šđčćž"
Dim Builder As New StringBuilder()
For Each Chr As Char In Input
Builder.Append(Chr)
Next
Console.Write(Builder.ToString())
输出是SDCZ-sdccz
【讨论】:
这会完全删除 Đ。 @Mark 你是对的,但是看看我的编辑,有点难以置信 嗯,我在本地尝试了 VB.NET 代码,得到了原始字符串。 @Ahmad 我敢打赌它与本地化设置有关。我必须说,当它产生所需的输出时,我被吓倒了。 这也删除了“ł”(抛光)。【参考方案3】:字典是解决这个问题的合乎逻辑的解决方案......
Dictionary<char, char> AccentEquivelants = new Dictionary<char, char>();
AccentEquivelants.Add('Š', 's');
//...add other equivelents
string inputstring = "";
StringBuilder FixedString = new StringBuilder(inputstring);
for (int i = 0; i < FixedString.Length; i++)
if (AccentEquivelants.ContainsKey(FixedString[i]))
FixedString[i] = AccentEquivelants[FixedString[i]];
return FixedString.ToString();
在进行这样的字符串操作时需要使用 StringBuilder,因为 C# 中的字符串是不可变的,因此一次更改一个字符会在内存中创建多个字符串对象,而 StringBuilder 是可变的,没有这个缺点。
【讨论】:
但字符数组不是。创建一个字符数组并修改其中的值。以上是关于C#中的字符串替换变音符号[重复]的主要内容,如果未能解决你的问题,请参考以下文章