【发布时间】: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-transformspecification,它声明如下: 在希腊语 (el) 中,当整个单词大写 (ά/Α) 时,元音会失去它们的重音,但分离式除外η (ή/Ή)。此外,在第一个元音上有重音的双元音会失去重音并在第二个元音(άι/ΑΪ)上获得分音。另见:Accent Marks denoting Stress in Greek, and Other Diacritics
标签: java localization internationalization