Java中的Unicode纠正标题案例

我一直在浏览所有StackOverflow中有关Java资本化问题的大量问题,而且他们似乎都不关心国际化,事实上似乎没有一个在国际背景下工作。 所以这是我的问题。

我在Java中有一个字符串,它代表一个单词 – 所有isLetter()字符,没有空格。 我想让第一个字符大写,其余小写。 我确实有我的单词的语言环境。

为字符串的最后一部分调用.substring(1).toLowerCase(Locale)很容易。 但我不知道如何获得正确的第一个角色。

我遇到的第一个问题是荷兰语,其中“ij”作为有向图应该一起大写。 我可以手工处理这个问题,因为我了解它; 现在可能还有其他语言有这种我不知道的东西,我相信如果我问得好的话,Unicode会告诉我。 但我不知道该怎么问。

即使上面的问题得到解决,我仍然没有办法处理英语,土耳其语和希腊语,因为Character支持titlecase但没有语言环境,而String支持语言环境但不支持标题。

如果我接受代码点,并将其传递给Character.toTitleCase(),则会失败,因为无法将语言环境传递给此方法。 因此,如果系统语言环境是英语,但单词是土耳其语,并且单词的第一个字符是“i”,我将得到“I”而不是“İ”,这是错误的。 现在,如果我使用子字符串并使用.toUpperCase(Locale),这将失败,因为它是高位而不是标题大小写。 因此,如果这个词是希腊语,我仍然会得到错误的字符。

如果有人有有用的指示,我会很高兴听到他们。

像你一样,我无法在核心Java API中找到合适的方法。

但是, ICU库中似乎确实存在对区域设置敏感的字符串标题大小写方法( UCharacter#toTitleCase ) 。


查看相关ICU方法的来源( UCharacter#toTitleCaseUCaseProps#toUpperOrTitle ),似乎没有很多针对title-casing的特定于语言环境的特殊情况,因此您可以使用以下内容:

  1. 在字符串中查找第一个套接字符。
  2. 如果它的标题 – 案例forms与其大写forms不同,请使用它。
  3. 否则,对该第一个字符及其组合字符执行区域设置敏感的大写。
  4. 对字符串的其余部分执行区域设置敏感的小写。
  5. 如果区域设置是荷兰语,并且第一个套接字符是“I”后跟“j”,则大写“j”。

这两个角色同时被大写,而你可能会在现实生活中遇到的唯一两个角色是荷兰语IJ。 如果语言环境是荷兰语,只需处理它。 在最糟糕的情况下,将会有1-2个案例需要稍后添加,并不是说你每天都会遇到新的大写图,所以不值得关注这里的泛化。

注意,通常,不可能使用字符到字符的转换来获得任意语言的标题或大写。 一些小写字符转换为多个大写字符。 所以你必须在一般情况下使用String。

但标题案例区域设置没有任何问题。 关于如何使用TitleCase()方法可能存在一些误解。 它会将任何字符转换为标题大小写,包括已经是大写字母的字符。

例如,考虑dž字符。 它的大写forms是DŽ ,标题案例forms是Dž

 System.out.println(Character.toUpperCase('\u01C4')); DŽ 

 System.out.println(Character.toTitleCase('\u01C4')); Dž 

但是,以下内容也将给出标题案例

 System.out.println(Character.toTitleCase(Character.toUpperCase('\u01C4'))); Dž 

因此,如果在标题大小写之前将区域设置转换为大写,则可以获得正确的代码点,并且在结果上使用标题大小写没有问题,包括土耳其语等:

 System.out.println(Character.toTitleCase("dž".toUpperCase().charAt(0))); System.out.println(Character.toTitleCase("i".toUpperCase(Locale.forLanguageTag("tr")).charAt(0))); Dž İ 

注意,如果与大写字母存在差异,仅使用单个字符的标题大小写在一般情况下是不正确的。

总结一下:

  • 处理荷兰有向图(或者如果遇到它们,可以使用其他有向图,我非常怀疑,在最坏的情况下,程序生命周期将是1-2个案例)。
  • 使用locale和toUpperCase()将所需字符转换为String
  • 使用Character toTitleCase转换toUpperCase结果的所有字符。

请注意,仍然存在一些具有上下文感知的大写情况,例如爱尔兰语前缀,英语名称等,这些不仅需要字符/字符串处理,而且我怀疑您需要在程序中处理它们以进行标题生成。

问题是大写和小写字母的区分是非常语言特定的。 这么多,也许是大多数语言都没有。

无论如何,有一个Unicode常见问题: http : //www.unicode.org/faq/casemap_charprop.html

..我想某处有一个特定于Unicode的映射表(类似于ftp://ftp.unicode.org/Public/UNIDATA/UnicodeData.txt )。 所以最好使用自己的转换方法。