为什么Java Character.toUpperCase / toLowerCase没有像String.toUpperCase / toLowerCase这样的Locale参数

时间:2014-10-22 18:59:11

标签: java locale multilingual uppercase lowercase

我想知道为什么Character.toUpperCase/toLowerCase没有像String.toUpperCase/toLowerCase这样的Locale参数。

我必须首先使用任何语言的大写文本。我有两个解决方案:

  1. 使用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
    
  2. 使用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
    
  3. 对于我的语言环境。两种方式都有相同的结果。

    我的问题是:

    • 由于文本可以使用任何语言。我应该使用哪种方式?

    • 为什么Character.toUpperCase/toLowerCase没有Locale参数,因为Character.toUpperCase/toLowerCaseString.toUpperCase/toLowerCase之间没有太大区别,因为String是字符数组。

4 个答案:

答案 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

如果问题是"为什么Character不具有区域设置敏感的案例更改方法",那么您可能获得答案的唯一方法就是咨询Java语言的设计者之一。 Stack Overflow社区不太可能为您提供所需的答案。

答案 3 :(得分:0)

在这里,我将解释与ToUpperCase之外的ToLowerCasechar s支持Stringchar版本的语言环境参数有关的一些问题无法解决:

  1. char的大写或小写版本都可能是跨越多个ß的字符串。一个示例是德语的SS扩展为大写的char

  2. char是一个16位值,但并非所有Unicode字符(甚至不是所有Unicode字母)都可以容纳在16位char中。因此,ToUpperCaseToLowerCase的{​​{1}}版本将不支持整个Unicode字符表。

  3. 某些情况下的映射转换(例如希腊语sigma)取决于上下文。也就是说,什么样的字符在所讨论的字符之前或之后。 char版本的ToUpperCase和ToLowerCase将没有这种可用的上下文。