How to convert from Katakana to Hiragana?

I want to convert a Japanese character string from katakana to hiragana. Leaving all characters other than katakana as is.
I have tried with toUpperCase and toLowerCase with the Locale JAPANESE, but both leave the string unmodified.

public class KataKanaAHiragana {

    static String entrada = "スタックオベルフロウ";

    public static void main(String[] args) {
        System.out.println( entrada.toUpperCase(Locale.JAPANESE) );
        System.out.println( entrada.toLowerCase(Locale.JAPANESE) );
    }
}

The result I get in both cases is:

スタックオベルフロウ

And what I want to get is:

すたっくおべるふろう

 3
Author: Anonymous Coward, 2015-12-24

2 answers

Important

There are two versions of Katakana, half-width and full-width.

We need to determine the version!

public static String AHiragana(String KatakanaString)
{
    StringBuilder sb = new StringBuilder();
    for(Character c : KatakanaString.toCharArray())
    {
        // Es un character medio-ancho?
        if(('\uff66' <= c) && (c <= '\uff9d'))
        {
            sb.append((char)(c-0xcf25));
        }
        else if(('\u30a1' <= c) && (c <= '\u30fe')) // ancho-completo
        {
            sb.append((char)(c-0x60));
        }
        else
        {
            sb.append(c);
        }
    }
    return sb.toString();
}
 4
Author: Dylan Meeus, 2020-06-11 10:54:57

I have been able to solve it based on the Code that Arturo Tena mentions.

private static final int KATAKANA_A_HIRAGANA = - 6 * 16;

public static String katakanaAHiragana(String cadena) {

    StringBuilder resultado = new StringBuilder( cadena.length() );

    for (int indice = 0; indice < cadena.length(); indice++) {

        final char caracter = cadena.charAt(indice);
        final char carConvertido;
        if ( caracter == 'ー') {
            //  'ー' es un carácter que también puede ser usado 
            // en katakana y que se deja igual en hiragana.
            carConvertido = caracter;
        } else if ( caracter>='ァ' && caracter<='ヴ' ) {
             carConvertido = (char) (((int) caracter) + KATAKANA_A_HIRAGANA );
        }
        else
        {
            // No tocar los caracteres que no son katakana
            carConvertido = caracter;
        }
        resultado.append(carConvertido);
    }

    return resultado.toString();
}
 1
Author: Anonymous Coward, 2015-12-24 09:27:54