【问题标题】:Which Locale should I specify when I call String#toLowerCase?调用 String#toLowerCase 时应该指定哪个语言环境?
【发布时间】:2012-05-07 09:08:51
【问题描述】:

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

编辑:我主要关心的是编程标识符,例如架构中的表名和列名。因此,我希望应用英文小写。

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

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

【问题讨论】:

  • “一些 ASCII 文本”:你真的是指 ASCII 文本吗?还是你的意思是“一些文字”?
  • 我的意思是 ASCII。我试图暗示我没有使用任何非 ASCII 字符。我已经澄清了这个问题。

标签: java localization internationalization


【解决方案1】:

是的,Locale.ENGLISH 是编程语言标识符和 URL 部分等大小写操作的安全选择,因为它不涉及任何特殊的大小写规则和英文大小写转换为 7- 中的所有 7 位 ASCII 字符位 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。因此大写然后小写,反之亦然,会更改字母。

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

...

【讨论】:

  • “这不适用于所有其他语言环境”,不能使用 ASCII。
  • 在什么情况下你会使用ROOT语言环境?我一直用它来表示我不想应用任何特殊情况折叠。
  • 使用 Locale.ROOT 创建的 DecimalFormat 仍然使用分组字符,这与 String.valueOf 不同。否则我认为 Locale.ROOT 可能会更清楚地表明该值是在内部使用而不是用于显示目的。
  • @MikeSamuel:我认为确实如此,但我仍在寻找与Locale.ENGLISH 是否有任何不同。
  • @Raedwald,“ASCII”是编码的名称,但它也指特定的 unicode code-page。不使用罗马字符的书写系统的语言环境会将 ASCII 字符大小写转换为 ASCII 字符,因为它们不包含任何涉及 ASCII 代码点的特殊大小写转换规则。
【解决方案2】:

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

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

【讨论】:

  • OP 说“一些 ASCII 文本”。由于 ASCII 仅对英文文本有用,因此“as expected”在英文中的含义必须与预期的一样。
  • @Raedwald,为什么是英语?拉丁字母用于几种不同的语言,不仅是欧洲语言。如果使用 ASCII 中的变音字母,则语言范围更广。
  • @CoolMind ASCII 没有任何个变音字母。您可能会将 ASCII 与扩展 ASCII 以提供变音符号和其他欧洲字母的几个 8 位字符集之一混淆。
  • @Raedwald,对不起,同意你的看法。大多数基于拉丁语的语言都有超过 26 个字母。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多