在Java中将希腊字母转换为大写

9

我想要做的事情非常简单:

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文档,我应该能够将区域设置传递给toUpperCase,如下所示:
String upper = example.toUpperCase(new java.util.Locale("el"));

然而,似乎没有特定的规则适用于正确处理希腊语的 toUpperCase

是否可以定义 toUpperCase 在特定区域设置下的行为,以确保我获得正确的结果?

或者,我可以编写一个实用程序类来处理这种特殊情况。但是如果可能的话,我更喜欢按地区覆盖此函数,以防其他语言出现此问题。


3
查看toUpperCase的源代码,似乎它只是单独地翻译每个字符,而不考虑文本的其他部分,除了三种情况:土耳其语,阿塞拜疆语和立陶宛语。这些都是硬编码到代码中的。因此,您可能需要自己编写代码。(另外,也许您应该将此作为错误报告提交给Oracle。) - ajb
这正是我担心的。我没有看到一个,但我希望有一种方法可以根据不同的语言环境来扩展该行为。 - Glen Balliet
1
PS:硬编码看起来像boolean localeDependent = (lang == "tr" || lang == "az" || lang == "lt");,他们正在使用“==”比较字符串。哎呀呀。 - ajb
@Glen:你能给我提供有关大写希腊字符语法规则的源链接吗?到目前为止,我知道最终Sigma在小写时被正确处理,但我从未听说过你提到的规则。 - Paweł Dyda
可能最好的例子是 text-transform 规范,该规范规定:在希腊语(el)中,除了闪烁 eta(ή/Ή)外,元音字母在整个单词都是大写字母(ά/Α)时失去了它们的重音。此外,具有第一个元音字母重音的双元音字母会失去重音,并在第二个元音字母上获得分音符(άι/ΑΪ)。参见: 希腊语中表示重音的重音符号和其他变音符号 - Glen Balliet
2个回答

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

编辑:我通过前端CSS的text-transform: uppercase解决了这个问题,所以与Java中的原始问题无关。结果证明,这是这个基于Web的应用程序的最简单的答案。


什么解决方案? - Meo
1
@Meo 如上所述,这是在 CSS 中处理的。 - Glen Balliet

-1

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

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(""));

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