希腊字符字符串转换为小写

7

我遇到了一些问题,需要将字符串"SΨZΣ"转换为小写。

在C#中使用.ToLower()和.ToLowerInvariant()均返回结果为"sψzσ"。 而javascript则返回"sψzς"。

经过一些研究,我认为已经理解了,字符'Σ'只有在不在单词结尾时才应该被转换为 'σ',否则应该变成 'ς' - 因此javascript版本是正确的。 事实上,当我使用C#字符串调用外部API时出现错误,而js字符串则可以正常工作。

您有什么想法,如何使C#正确地将字符串转换为小写?

2个回答

1

很遗憾,在C#中没有默认的方法可以实现这一点;当我看到你的问题时,我猜想可能是设置区域文化可以解决问题,例如:

string s = "SΨZΣ".ToLower(new CultureInfo("el-GR"));

但不幸的是,这并不奏效。问题更加复杂,因此需要我们自己解决:

    public string GreekToLower(string s)
    {
        string lowerString = s.ToLower();

        // Matches any 'σ' followed by whitespace or end of string
        string returnString = Regex.Replace(lowerString, "σ(\\s+|$)", "ς$1");
        return returnString;
    }

这会将您的字符串转换为小写,然后查找任何后面跟有一个或多个空格或出现在字符串末尾(字符串中的最后一个单词可能不会跟随空格)的 'σ' 字符,然后用 'ς' 替换它,并保留它发现的任何现有空格。
正则表达式可能最适合这些类型的场景。我猜您可能还想确保希腊变音符号也被添加或删除,比如对于像 Ρύθμιση 这样的单词使用 tonos --> ΡΥΘΜΙΣΗ。这可以完成,但是更加复杂,需要一个更重的正则表达式来评估所有情况。

1
最好找一个单词边界,考虑单词后面的标点符号(逗号、句号等)。 - pinkfloydx33
@pinkfloydx33 对的,但这也会捕捉到字符,例如撇号、连字符等等。这可能发生在单词中间。我不太确定 OP 在这方面的期望行为。 - The Headmaster

0

我不熟悉希腊字母表,但我建议在这里实现您自己的小写方法,以下是一个示例

char ToLowerCaseGreek(char letter) =>
return (char)(((int)letter) - ((int)'Α') - ((int)'α'));

首先,我们计算大写希腊字母表(大写阿尔法)与小写希腊字母表(小写阿尔法)之间的偏移量,然后从我们的大写希腊字母表字符中减去该偏移量,以获取与其匹配的小写字符。


你的代码存在几个问题;如果你使用lambda表达式操作符=>,这意味着return,如果在其后使用return,编译器会报错。第二个问题是它实际上并没有按照预期工作,当我输入"SΨZΣ"时,它给出了"螺ﱦ落ﱡ"的结果。 - The Headmaster

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