当我调用 String#toLowerCase 时,我应该指定哪个区域设置?

2022-09-01 13:23:28

在 Java 中,该方法使用缺省系统来确定如何处理小写。如果我正在降低一些 ASCII 文本,并希望确保按预期处理它,我应该使用哪个区域设置?String#toLowerCaseLocale

编辑:我主要关心编程标识符,例如架构中的表和列名称。因此,我希望英语下层外壳适用。

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

Locale.ENGLISH大概也是一个安全的选择。


答案 1

是的,对于编程语言标识符和URL部分等内容的大小写操作,它是一个安全的选择,因为它不涉及任何特殊的大小写规则,并且英语中的所有7位ASCII字符都转换为7位ASCII字符。Locale.ENGLISH

并非所有其他区域设置都是如此。在土耳其语中,“I”和“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。因此,大写然后小写,反之亦然,会改变字母。

特殊例外列表保留在 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

...


答案 2

如果我正在降低一些 ASCII 文本,并希望确保按预期处理它,我应该使用哪个区域设置?

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


推荐