Java 调用字符串#toLowerCase时应指定哪个语言环境?

Java 调用字符串#toLowerCase时应指定哪个语言环境?,java,localization,internationalization,Java,Localization,Internationalization,在Java中,String#toLowerCase方法使用默认系统Locale来确定如何处理小写。如果我将一些ASCII文本小写,并希望确保它按预期处理,我应该使用哪个语言环境 编辑:我主要关注编程标识符,例如模式中的表名和列名。因此,我希望英文小写适用 Locale.ROOT声明它是区域设置敏感操作的语言/国家中立区域设置 Locale.ENGLISH大概也是一个安全的选择。是的,Locale.ENGLISH对于编程语言标识符和URL部分之类的大小写操作是一个安全的选择,因为它不涉及任何特殊的

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

编辑:我主要关注编程标识符,例如模式中的表名和列名。因此,我希望英文小写适用

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


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

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


并非所有其他地区都是如此。在土耳其语中,“I”和“I”字符不进行大小写转换

说明:

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

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

大多数Unicode软件都是大写字母ı到I和小写字母İ到I,但是,除非专门为土耳其语设置,否则它将小写字母I到I和大写字母I到I。因此,大写字母然后小写字母,或者反之亦然,会改变字母

特殊例外情况列表保存在

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


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

“并非所有其他区域设置都是这样”,它们不能使用ASCII。在什么情况下,您会使用根区域设置?“我一直在用它来表示我不想应用任何特殊的案例折叠。”雷德瓦尔德,我不确定我是否理解。请详细说明您的评论好吗?使用Locale.ROOT创建的十进制格式仍然使用分组字符,这与
String.valueOf
不同。否则,我认为Locale.ROOT可能会更清楚地表明该值是在内部使用的,而不是用于显示目的。@Raedwald,“ASCII”是编码的名称,但它也指特定的unicode。不使用罗马字符的书写系统的区域设置会将ASCII字符大小写折叠为ASCII字符,因为它们不包括任何涉及ASCII码点的特殊大小写转换规则。OP表示“一些ASCII文本”。由于ASCII仅适用于英文文本,“预期”在英文中必须表示预期。@Raedwald,为什么是英文?拉丁字母在几种不同的语言中使用,不仅仅是欧洲语言。如果使用ASCII中的变音字母,则语言范围更广。@CoolMind ASCII没有任何变音字母。您可能将ASCII与几个8位字符集中的一个混淆了,这些字符集扩展了ASCII以提供变音符号和附加的欧洲字母。@Raedwald,对不起,同意您的看法。大多数以拉丁语为基础的语言有26个以上的字母。“一些ASCII文本”:你真的是指ASCII文本吗。或者你是说“一些文本”?我是说ASCII码。我试图暗示我没有使用任何非ASCII字符。我已经澄清了这个问题。
# ================================================================================

# 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