我想知道为什么Character.toUpperCase/toLowerCase
没有像String.toUpperCase/toLowerCase
这样的Locale参数。
我必须首先使用任何语言的大写文本。我有两个解决方案:
使用Character.toUpperCase
String text = "stack overflow";
StringBuilder sb = new StringBuilder(text);
sb.setCharAt(0, Character.toUpperCase(sb.charAt(0))); // No Locale parameter here.
String out = sb.toString(); //Out: Stack overflow
使用String.toUpperCase
Locale myLocale = new Locale(locateId);
String text = "stack overflow";
String text1 = text.substring(0,1).toUpperCase(myLocale );
String text2 = text.substring(1);
String out = text1 + text2; // Out: Stack overflow
对于我的语言环境。两种方式都有相同的结果。
我的问题是:
由于文本可以使用任何语言。我应该使用哪种方式?
为什么Character.toUpperCase/toLowerCase
没有Locale参数,因为Character.toUpperCase/toLowerCase
和String.toUpperCase/toLowerCase
之间没有太大区别,因为String是字符数组。
答案 0 :(得分:5)
正如Javadoc所说:
通常,应使用String.toUpperCase()将字符映射为大写。字符串大小写映射方法比字符大小写映射方法有几个好处。字符串大小写映射方法可以执行区域设置敏感的映射,上下文相关的映射和1:M字符映射,而字符大小写映射方法则不能。
所以使用String.toUppercase()
答案 1 :(得分:3)
来自Character#toUpperCase(int)
Javadoc,
通常,
String.toUpperCase()
应该用于将字符映射为大写。String
案例映射方法比Character
案例映射方法有几个好处。String
大小写映射方法可以执行区域设置敏感的映射,上下文相关的映射和1:M字符映射,而Character
大小写映射方法则不能。
所以,答案是您的第二个示例(String.toUpperCase
)
答案 2 :(得分:1)
如果问题是"我应该使用哪种方法",那么此问题与String conversion to Title Case重复,正确的答案是EITHER
StringUtils.captitalize()
- Javadoc http://commons.apache.org/proper/commons-lang/javadocs/api-2.5/org/apache/commons/lang/StringUtils.html WordUtils.capitalize()
- 位于http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/text/WordUtils.html的Javadoc。这会使每个单词都大写。如果问题是"为什么Character
不具有区域设置敏感的案例更改方法",那么您可能获得答案的唯一方法就是咨询Java语言的设计者之一。 Stack Overflow社区不太可能为您提供所需的答案。
答案 3 :(得分:0)
在这里,我将解释与ToUpperCase
之外的ToLowerCase
和char
s支持String
和char
版本的语言环境参数有关的一些问题无法解决:
char
的大写或小写版本都可能是跨越多个ß
的字符串。一个示例是德语的SS
扩展为大写的char
。
char
是一个16位值,但并非所有Unicode字符(甚至不是所有Unicode字母)都可以容纳在16位char
中。因此,ToUpperCase
和ToLowerCase
的{{1}}版本将不支持整个Unicode字符表。
某些情况下的映射转换(例如希腊语sigma)取决于上下文。也就是说,什么样的字符在所讨论的字符之前或之后。 char
版本的ToUpperCase和ToLowerCase将没有这种可用的上下文。