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#中的字符串替换变音符号[重复]的主要内容,如果未能解决你的问题,请参考以下文章

用英语等价物替换德语字符(变音符号、重音符号)

sql 数据库将坏字符替换为德语(变音符号)字符

从雪花中的字符串中删除变音符号[重复]

在 Swift 中使用变音符号转换字符串

如何解决 RStudio 面板上替换字符“�”的问题?

smarty 在 php 7.2 和德语变音符号上替换 ans ISO-8859-1 的问题