关于本地化:在Java中将希腊语转换为大写

Converting Greek to Uppercase in Java

我想做的相当简单:

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

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

1
2
3
4
5
// upper contains the following (incorrect) string:
// Τ?ΧΙΣΤΗ ΑΛ?ΠΗΞ ΒΑΦ?Σ ΨΗΜ?ΝΗ ΓΗ - MARY HAD A LITTLE LAMB

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

(口音很难看,但它们就在那儿。)

根据Java 1.7文档,我应该能够将区域设置传递给EDCOX1×0,例如:

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

然而,对于正确处理希腊语的toUpperCase,似乎没有具体的规则。

是否可以为特定区域定义toUpperCase的行为,以便确保得到正确的结果?

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


默认情况下,在Java中不支持这一点。我必须创建自己的解决方案。


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

1
2
3
4
5
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(""));