【问题标题】:Greek characters string to lower case希腊字符串转小写
【发布时间】:2018-12-08 16:25:53
【问题描述】:

我在将字符串“SΨZΣ”转换为小写时遇到了一些麻烦。

在 C# 中,.ToLower() 和 .ToLowerInvariant() 都会给我“sψzσ”作为结果。 而 javascript 返回“sψzς”。

经过一些研究,我认为已经理解字符 'Σ' 应该被翻译成 'σ' 只有当它不在单词的末尾时,在这种情况下它应该变成一个 'ς' - 所以javascript版本很好。 事实上,我在使用 C# 字符串调用外部 API 时遇到了错误,而 js 字符串工作正常。

关于如何让 C# 正确降低字符串的任何想法?

【问题讨论】:

    标签: javascript c# string cultureinfo


    【解决方案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;
        }
    

    这会将您的字符串小写,然后查找后跟一个或多个空格或出现在字符串末尾的任何“σ”字符(字符串中的最后一个单词可能不会跟有空格)和然后用 'ς' 替换它,保留它找到的任何现有空格。

    Regex 可能最适合这些类型的场景。我猜您可能还想确保添加或删除希腊变音符号,例如 Ρύθμιση --> ΡΥΘΜΙΣΗ 等词的音调。这可以做到,但它更复杂,需要更繁重的正则表达式来评估所有情况。

    【讨论】:

    • 寻找单词边界可能会更好,单词后面的标点符号(逗号、句号等)呢
    • @pinkfloydx33 是的,但这也会捕获诸如撇号、连字符等字符,这些字符可能会出现在单词的中间。我不完全确定 OP 在这方面的期望行为。
    【解决方案2】:

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

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

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

    【讨论】:

    • 您的代码有一些问题;如果您使用 lambda 表达式运算符,=> 这意味着 return,如果您在其后使用 return,编译器会报错。第二个问题是它实际上并没有按预期工作,当我输入“SΨZΣ”时给出“螺ﱦ落ﱡ”的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 2013-09-30
    • 2012-05-16
    • 2020-04-10
    相关资源
    最近更新 更多