我在将字符串"SΨZ∑"转换为小写时遇到了一些问题。
在C#中,.ToLower((和.ToLowerInvariant((都给出了"sψzσ"作为结果。而javascript返回"sψzς"。
经过一些研究,我想我已经明白了,只有当字符"∑"不在单词末尾时,它才应该被翻译成"σ",在这种情况下,它应该被转换成"ς"——所以javascript版本是可以的。事实上,当使用C#字符串调用外部API时,我会遇到错误,而js字符串工作正常。
你知道我如何让C#正确地降低字符串吗?
不幸的是,在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;
}
这会降低字符串的大小写,然后查找后面跟着一个或多个空格或出现在字符串末尾的任何"σ"字符(字符串中的最后一个单词后面可能不会跟着空格(,然后用"ς"替换它,保留它找到的任何现有空格。
Regex可能最适合这些类型的场景。我猜你可能还想确保希腊变音符号也被添加或删除,就像单词的音调一样,比如¦Βθμιση-->¦ΒΘμ∑¦Β。这是可以做到的,但它要复杂得多,并且需要更重的正则表达式来评估所有情况。
我不熟悉希腊字母表,但我建议实现您自己的小写方法,这里是一个示例
char ToLowerCaseGreek(char letter) =>
return (char)(((int)letter) - ((int)'Α') - ((int)'α'));
首先,我们计算大写希腊字母表(大写字母阿尔法(的开头和小写希腊字母表的开头之间的偏移量(小写字母阿尔法(,然后从大写希腊字母字符中减去偏移量,得到与之匹配的小写字符。