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),这将失败,因为它是高位而不是标题大小写.因此,如果这个词是希腊语,我仍然会得到错误的字符.
如果有人有有用的指示,我会很高兴听到他们.
像你一样,我无法在核心Java API中找到合适的方法.
但是,ICU库中似乎确实存在区分设置敏感的string-title-case方法(UCharacter#toTitleCase
).
查看相关ICU方法(UCharacter#toTitleCase
和UCaseProps#toUpperOrTitle
)的来源,似乎没有很多针对title-casing的特定于语言环境的特殊情况,因此您可以使用以下内容:
荷兰语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)
请注意,在一般情况下,如果仅使用单个字符的标题大小写与大写字母存在差异,则不正确。
总结一下:
请注意,仍然存在一些上下文相关的大写字母,例如爱尔兰前缀,英语ff名称等,它们不仅仅需要字符/字符串处理,但是我怀疑您需要处理它们才能在程序中生成标题。
归档时间: |
|
查看次数: |
2375 次 |
最近记录: |