2012-06-16 12 views
48

Quería que el código convirtiera todos los caracteres en cadenas a mayúsculas o minúsculas en Java.Uso de configuraciones regionales con toLowerCase() de Java y toUpperCase()

He encontrado un método que es algo como esto:

public static String changelowertoupper() 
{ 
     String str = "CyBeRdRaGoN"; 
     str=str.toLowerCase(Locale.ENGLISH); 
     return str; 
} 

Ahora he leído que el uso de ciertos Locale s, como el turco, "devuelve i (sin punto) en lugar de yo (con punto). "

¿Es seguro usar Locale como UK, US, ENGLISH, etc.? ¿Hay grandes diferencias entre ellos cuando se aplican a las cadenas?

¿Cuál es el más preferido Locale para String s?

+1

¿Intentó no usar configuraciones regionales? – alaster

+1

lo probé ... es similar a Locale.ENGLISH ...... pero aún dudo si tiene alguna diferencia ya que existe para los turcos .... por lo que decir que no uses Locales haría ... ¿??? –

+4

Su aplicación elegirá la configuración regional predeterminada, de modo que si alguien ejecuta su aplicación en turco con configuración local turca, verá 'i' sin el punto – alaster

Respuesta

49

Creo que se debe utilizar la configuración regional,

Para Por ejemplo, "TITLE" .toLowerCase() en una configuración regional turca devuelve "tilet", donde "ı" es el carácter LETIN SMALL LETTER DOTLESS I. Para obtener resultados correctos para las cadenas insensibles a la configuración regional, use en LowCase (Locale.ENGLISH).

me refiero a estos enlaces como solución a su problema y que tiene un punto a tener en cuenta en que situación "Turco"

**FROM THE LINKS** 

toLowerCase() respeta la internacionalización (i18n). Realiza la conversión de caso con respecto a su configuración regional. Cuando llama al a LowCase(), internamente aLowerCase (Locale.getDefault()) se llama al . Es sensible a la configuración regional y no debe escribir una lógica alrededor de interpretando la configuración regional de forma independiente.

import java.util.Locale; 

public class ToLocaleTest { 
    public static void main(String[] args) throws Exception { 
     Locale.setDefault(new Locale("lt")); //setting Lithuanian as locale 
     String str = "\u00cc"; 
    System.out.println("Before case conversion is "+str+ 
" and length is "+str.length());// Ì 
     String lowerCaseStr = str.toLowerCase(); 
    System.out.println("Lower case is "+lowerCaseStr+ 
" and length is "+lowerCaseStr.length());// iı` 
    } 
} 

En el programa anterior, un vistazo a la longitud de la cadena antes y después de la conversión . Será 1 y 3. Sí, la longitud de la cadena antes de y después de la conversión del caso es diferente. Su lógica irá por un lanzamiento cuando dependa de la longitud de la cadena en este escenario. Cuando su programa se ejecuta en un entorno diferente, puede fallar. Esta será una buena captura de en la revisión del código.

Para hacerlo más seguro, puede usar otro método para LowCase (Locale.English) y anular la configuración regional en inglés siempre. Pero luego no estás internacionalizado.

Así que el quid de la cuestión es que toLowerCase() es específico de la localidad.

reference 1
reference 2
reference 3


sin punto-i, es una minúscula 'i' sin punto. La mayúscula de este personaje es el "Yo" habitual. Hay otro personaje, "Yo con punto". La letra minúscula de este carácter es la "i" minúscula habitual.

¿Ha notado el problema? Esta conversión no simétrica causa un problema grave en la programación. Enfrentamos este problema principalmente en aplicaciones Java debido a la implementación deficiente (IMHO) de las funciones toLowerCase y toUpperCase.

En Java, el método String.toLowerCase() convierte los caracteres a minúsculas de acuerdo con la configuración regional predeterminada. Esto causa problemas si su aplicación funciona en la configuración regional de Turquía y especialmente si está utilizando esta función para un nombre de archivo o una URL que debe obedecer a un determinado conjunto de caracteres.

He escrito sobre dos ejemplos serios antes: Los errores de compilación con bibliotecas de scripts con "i" en sus nombres y la falla del Administrador XSP si una página está con una "I" en su nombre.

Hay una larga historia, como dije. Por ejemplo, en alguna versión R7, el enrutador no pudo enviar un mensaje a un destinatario si su nombre comienza con "I". Los agentes de informes de mensajes no se estaban ejecutando en la configuración turca hasta R8. Cualquier persona con configuración regional turca no podría instalar Lotus Notes 8.5.1 (¡es real!). La lista continúa ...

Casi no existe un beta tester de Turquía y los clientes no abren PMR por estos problemas. Entonces estos problemas no van a la primera prioridad para los equipos de desarrollo.

equipo Incluso Java ha añadido una advertencia especial a la documentación más reciente:

Este método es sensible al entorno local, y puede producir resultados inesperados si utilizados para las cadenas que están destinados a ser interpretados local forma independiente. Algunos ejemplos son identificadores de lenguaje de programación, claves de protocolo y etiquetas HTML. Por ejemplo, "TITLE" .toLowerCase() en un entorno local turco devuelve "tilet", donde "ı" es el carácter LATIN SMALL LETTER DOTLESS I . Para obtener resultados correctos para cadenas insensibles a la configuración regional, use toLowerCase (Locale.ENGLISH).

LEA LOS ENLACES BISELO Post TODO ESO "ESTA ES LA RESPUESTA A SU COMENTARIO"

+1

para decir si especifiqué Locale como INGLÉS o simplemente str.toLowerCase(). Sería bueno ... y no tengo que preocuparme por la longitud de la cuerda ... ??? –

+3

LEA POR FAVOR LOS ENLACES QUE NO PUEDO PUBLICAR TODO "ESTO ES RESPUESTA A SU COMENTARIO" – shareef

+1

k ... bien ... lo tengo ... gracias .. –

5
String str = "CyBeRdRaGoN"; 

str = str.toLowerCase(); // str = "cyberdragon" 

str = str.toUpperCase(); // str = "CYBERDRAGON" 

Su aplicación se elige regional predeterminada, por lo que si alguien va a ejecutar su aplicación en turco con entorno local turco verá i sin puntos

2

Puede crear entorno local correspondiente para el lenguaje de sus String 's.

Por ejemplo:

toUpperCase(new Locale("tr","TR")); 

hará el truco para el turco.

0

Si está utilizando esta función para verificar una cadena (por ejemplo, búsqueda) Es seguro usar las cadenas en mayúsculas o minúsculas para verificar.Usted puede utilizar de esta manera:

if (mViewData.list.data[i].Name.toLowerCase(new Locale("tr", "TR")) 
    .contains(mViewHolder.tctSearch.getText().toString().trim() 
             .toLowerCase(new Locale("tr", "TR")))) { 
    // your code here... 
} 

enfrento el mismo problema, pero en un caso de búsqueda en la vista de lista. Agregué esta respuesta que puede ayudar a alguien que tiene el mismo problema.

Cuestiones relacionadas