Java中的Unicode纠正标题案例

Jea*_*ean 30 java string unicode

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

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

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

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

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

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

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

Stu*_*ook 7

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

但是,ICU库中似乎确实存在区分设置敏感的string-title-case方法(UCharacter#toTitleCase).


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

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


Fed*_*sev 5

荷兰语IJ是唯一在两个字符中同时将两个字符都大写的字母,并且您可能会在现实生活中遇到该字母。如果语言环境是荷兰语,则只需处理即可。在最不可能的情况下,以后需要添加1-2种情况,这不是每天都会遇到新的大写字母,因此这里不值得集中讨论。

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

但是标题大小写区域设置没有任何问题。关于toTitleCase()方法的工作方式可能会有一个小小的误解。它将任何字符转换为标题,包括已经大写的字符。

例如,考虑字符。它的大写形式是标题案例形式是

System.out.println(Character.toUpperCase('\u01C4'));
?
Run Code Online (Sandbox Code Playgroud)

System.out.println(Character.toTitleCase('\u01C4'));
?
Run Code Online (Sandbox Code Playgroud)

但是,下面还将给出标题大小写

System.out.println(Character.toTitleCase(Character.toUpperCase('\u01C4')));
?
Run Code Online (Sandbox Code Playgroud)

因此,如果您将语言环境转换为标题大小写之前的大写形式,则会获得正确的代码点,并且在结果上使用标题大小写(包括土耳其语等)没有问题:

System.out.println(Character.toTitleCase("?".toUpperCase().charAt(0)));
System.out.println(Character.toTitleCase("i".toUpperCase(Locale.forLanguageTag("tr")).charAt(0)));
?
?
Run Code Online (Sandbox Code Playgroud)

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

总结一下:

  • 处理荷兰语有向图(或其他有向图,如果遇到它们,我非常怀疑,在程序生命周期中,最糟糕的情况是1-2种情况)。
  • 使用区域设置和toUpperCase()将所需的字符转换为String
  • 使用Character toTitleCase转换toUpperCase结果的所有字符。

请注意,仍然存在一些上下文相关的大写字母,例如爱尔兰前缀,英语ff名称等,它们不仅仅需要字符/字符串处理,但是我怀疑您需要处理它们才能在程序中生成标题。