Search code examples
javalocalemultilingualuppercaselowercase

Why Java Character.toUpperCase/toLowerCase has no Locale parameter like String.toUpperCase/toLowerCase


I am wondering that why Character.toUpperCase/toLowerCase has no Locale parameter like String.toUpperCase/toLowerCase.

I have to first uppercase of a text that can be in Any language. I have 2 solutions:

  1. Use 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. Use 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
    

For my Locale. Both way has the same result.

My question is:

  • Since the text can be in any language. Which way should I use?

  • Why Character.toUpperCase/toLowerCase has no Locale parameter because there is not much difference between Character.toUpperCase/toLowerCase and String.toUpperCase/toLowerCase because String is array of Characters.


Solution

  • From the Character#toUpperCase(int) Javadoc,

    In general, String.toUpperCase() should be used to map characters to uppercase. String case mapping methods have several benefits over Character case mapping methods. String case mapping methods can perform locale-sensitive mappings, context-sensitive mappings, and 1:M character mappings, whereas the Character case mapping methods cannot.

    So, the answer is your second example (String.toUpperCase)