【问题标题】:lower case of turkish character dotted i土耳其字符的小写加点 i
【发布时间】:2014-06-24 19:26:26
【问题描述】:

在 Java 6 中,

System.out.println(String.valueOf('\u0130').toLowerCase());

打印 i (u0069),但在 Java 7 中打印带有双点的 i (u0069 u0307)。

我知道它是土耳其语字符,但如何使用此代码使 Java 7 打印与 v6 相同的输出?

System.out.println(inputText.toLowerCase());

还要确保代码可以处理国际文本,而无需将 toLowerCase 函数硬编码为仅使用土耳其语区域设置。

【问题讨论】:

  • 我怀疑您需要指定您正在使用的语言环境(作为第一个参数)。 Java 7 可能使用不同的默认语言环境。
  • @PeterLawrey 是的,Java 通过Locale.getdefault 使用默认语言环境,在我的例子中是 en_US.UTF-8。但我已经读到,在 java 7 中,这个特殊的土耳其字符的处理方式与以前的版本不同。参考:link
  • 考虑指定Normal Form
  • 有许多字符的大写、小写或标题大小写是两个字符而不是一个。这对 String 来说更为明显。
  • 您的代码中应该有一个大警告,告诉您您正在使用 toLowerCase 而不指定语言环境

标签: java locale java-7 turkish


【解决方案1】:

有一个比较详细的blog post about this i toLowerCase problem


让我试着总结一下重要的部分:

在 Java 7 中,此方法确实发生了变化,并且处理此字符的方式与 Java 6 不同。添加了以下代码:

} else if (srcChar == '\u0130') { // LATIN CAPITAL LETTER I DOT
    lowerChar = Character.ERROR;
}

==> 这种变化会产生以下结果:

基本上,这种变化的最终结果是针对这种特定情况 (大写加点的 I),Java 7 现在使用特殊的 Unicode 字符数据库 (http://www.unicode.org/Public/UNIDATA/SpecialCasing.txt), 其中 提供有关复杂案例映射的数据。看这个文件你可以 看到几行大写的虚线 I:

CODE       LOWER   TITLE   UPPER  LANGUAGE
0130;  0069 0307;   0130;   0130;
0130;  0069;        0130;   0130;       tr;
0130;  0069;        0130;   0130;       az;

【讨论】:

  • 是的@donfuxx,我已经阅读了该网站。我想知道一种更好的方法来获得与 java 6 相同的输出。在上面的链接中,作者提到使用 dumpUnicodeCodePoints(String.valueOf('\u0130').toLowerCase(new Locale("tr"))); 但是我在处理国际文本时不能只使用土耳其语语言环境。跨度>
  • 嗯...也许在 String.toLowerCase 之后快速而肮脏的 String.replace 对你有用吗? @ikirankumar
  • @donfuxx 是的,就是这样。我仍在寻找更简洁的方法来处理 Java 版本之间的类似翻译差异(如果有)
  • @ikirankumar 得到与 java 6 相同的输出 意味着您忽略了 Java 7 对该语言所做的修复。它可能是您的解决方案,但它忽略了需要修复的语言,因此,在某种程度上,它对土耳其语不友好。但是,如果您不在系统中使用土耳其语(或其他已修复的语言),那么您当然不需要关心这些。
猜你喜欢
  • 2020-10-02
  • 2014-02-09
  • 2012-05-13
  • 2016-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-02
相关资源
最近更新 更多