当我调用String toLowerCase时,我应该指定哪个Locale

时间:2012-04-26 15:38:11

标签: java localization internationalization

在Java中,String toLowerCase方法使用默认系统Locale来确定如何处理小写。如果我小写一些ASCII文本,并希望确保按预期处理,我应该使用哪种语言环境?

编辑:我主要关注的是在模式中编写表名和列名等标识符。因此我想要英文下套管适用。

Locale.ROOT声明它是区域设置敏感操作的语言/国家/地区中性区域设置

Locale.ENGLISH可能也是一个安全的选择。

2 个答案:

答案 0 :(得分:5)

是的,Locale.ENGLISH是编程语言标识符和URL部分等案例操作的安全选择,因为它不涉及任何特殊的大小写规则和ENGLISH案例中的所有7位ASCII字符 - 转换为7位ASCII字符。

对于所有其他语言环境,情况并非如此。在土耳其语中,'I'和'i'字符不会相互转换。

"Dotted and dotless I"解释说:

  

土耳其语字母,是拉丁字母的变体,包括字母I的两个不同版本,一个点缀,另一个无点。

     

在Unicode中,U + 0131是小写字母无点i(ı)。 U + 0130(İ)是带点的大写字母i。 ISO-8859-9分别在0xFD和0xDD位置。在正常排版中,当小写字母i与其他变音符号组合时,通常在添加变音符号之前去除点;但是,Unicode仍然列出了包含点i的等效组合序列,因为从逻辑上讲,它是正在修改的正常点缀i字符。

     

大多数Unicode软件大写ı到I和小写İ到i,但是,除非专门为土耳其语设置,它将I改为I,将大写I改为I.因此,大写然后小写,反之亦然,改变字母。< / p>

特殊例外列表保留在http://unicode.org/Public/UNIDATA/SpecialCasing.txt

# ================================================================================

# Turkish and Azeri

# I and i-dotless; I-dot and i are case pairs in Turkish and Azeri
# The following rules handle those cases.

0130; 0069; 0130; 0130; tr; # LATIN CAPITAL LETTER I WITH DOT ABOVE
0130; 0069; 0130; 0130; az; # LATIN CAPITAL LETTER I WITH DOT ABOVE

# When lowercasing, remove dot_above in the sequence I + dot_above, which will turn into i.
# This matches the behavior of the canonically equivalent I-dot_above

0307; ; 0307; 0307; tr After_I; # COMBINING DOT ABOVE
0307; ; 0307; 0307; az After_I; # COMBINING DOT ABOVE
     

...

答案 1 :(得分:2)

  

如果我正在小写一些ASCII文本,并希望确保按预期处理这个,我应该使用哪种语言环境?

这取决于“预期”对你意味着什么。允许指定Locale的要点是大写/小写在所有语言中都不起作用,即使它们可能使用相同的字母。因此,请指定您和/或您的客户所居住的区域设置,它可能会按您/他们的期望工作。