【问题标题】:Converting Greek to Uppercase in Java在 Java 中将希腊语转换为大写
【发布时间】:2014-07-07 22:59:02
【问题描述】:

我想做的很简单:

String example = "Τάχιστη αλώπηξ βαφής ψημένη γη - Mary Had A Little Lamb";
String upper = example.toUpperCase();

在希腊语中,只有大写单词的第一个字母应该包含重音字符。

// upper contains the following (incorrect) string:
// ΤΆΧΙΣΤΗ ΑΛΏΠΗΞ ΒΑΦΉΣ ΨΗΜΈΝΗ ΓΗ - MARY HAD A LITTLE LAMB

// correct string:
// ΤΑΧΙΣΤΗ ΑΛΩΠΗΞ ΒΑΦΗΣ ΨΗΜΕΝΗ ΓΗ - MARY HAD A LITTLE LAMB 

(重音很难看到,但它们就在那里。)

根据Java 1.7 documentation,我应该能够将语言环境传递给toUpperCase,如下所示:

String upper = example.toUpperCase(new java.util.Locale("el"));

但是,toUpperCase 似乎没有正确处理希腊语的特定规则。

是否可以为特定语言环境定义 toUpperCase 的行为,以便确保获得正确的结果?

或者,我可以编写一个实用程序类来处理这种特殊情况。但如果可能的话,我更愿意根据语言环境覆盖这个函数,以防其他语言出现这种情况。

【问题讨论】:

  • 查看toUpperCase 的来源,它似乎只是单独翻译每个字符,而不查看文本的其余部分,除了三种情况:土耳其语、阿塞拜疆语、立陶宛语。这些都是硬连线到代码中的。所以你可能不得不自己动手。 (P.S. 也许您应该将此作为错误报告提交给 Oracle。)
  • 这就是我害怕的。我没有看到,但我希望有一种方法可以扩展每个区域设置的这种行为。
  • P.S.硬连线代码看起来像boolean localeDependent = (lang == "tr" || lang == "az" || lang == "lt");。 他们正在使用== 来比较字符串。 Gaaaaaaaaack。
  • @Glen:你能给我链接到与大写希腊字符相关的语法规则的来源吗?到目前为止,我知道 Final Sigma 在小写时得到了正确处理,但我从未听说过你提到的规则。
  • 可能最好的例子是text-transform specification,它声明如下: 在希腊语 (el) 中,当整个单词大写 (ά/Α) 时,元音会失去它们的重音,但分离式除外η (ή/Ή)。此外,在第一个元音上有重音的双元音会失去重音并在第二个元音(άι/ΑΪ)上获得分音。另见:Accent Marks denoting Stress in Greek, and Other Diacritics

标签: java localization internationalization


【解决方案1】:

根据@ajb,Java 默认不支持此功能。我必须创建自己的解决方案。

【讨论】:

  • 什么解决方案??
【解决方案2】:

我尝试了以下方法,似乎有效:

String example = "Τάχιστη αλώπηξ βαφής ψημένη γη - Mary Had A Little Lamb";
String upper = example.toUpperCase();
String temp = Normalizer.normalize(upper, Normalizer.Form.NFD);
Pattern pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
System.out.println(pattern.matcher(temp).replaceAll(""));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-15
    • 2017-03-29
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多