C#中替换变音符号的字符串处理方法

10
我想使用这个方法来创建用户友好的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);

希望有人能提供帮助。

这段文本与IT技术没有直接关系。

4
请见https://dev59.com/g3E95IYBdhLWcg3wPrgI - Mark Byers
请查看我回答的编辑! - Josh Stodola
3个回答

17

看起来你希望去掉发音符号并保留基本字符。我建议你使用Ben Lings的解决方案

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' 可以找到(您是否缺少使用指令或程序集引用?) - ilija veselica
@ile:显然我从中复制的解决方案存在错误。我已经修复了它。不幸的是,这种方法对于Đ无效,因此您将不得不特别处理该情况,或者按照您最初建议的方式执行。 - Mark Byers
我明白了... 但这是非常简单的解决方案,我将使用它并使用特殊方法替换Đ和đ。谢谢! - ilija veselica

17

Jon Skeet 在一个新闻组中提到了以下代码...

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 Byers
@Mark 你说得没错,但请看我的编辑,有点难以置信。 - Josh Stodola
我尝试在本地运行那段VB.NET代码,但是我得到了原始字符串。 - Ahmad Mageed
@Ahmad 我敢打赌它某种程度上与本地化设置有关。我必须说,当它产生所期望的输出时,我感到很受挫。 - Josh Stodola
这也会移除“ł”(波兰语)。 - user1713059
Id不适用于'ł'和'€'字符。 - ahaw

0

使用字典可能是解决这个问题的合理方案...

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 是可变的,不具有这种缺点。

但字符数组不是。创建一个字符数组并修改其中的值。 - Timothy Baldridge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接