Usando Locales com toLowerCase () e toUpperCase () do Java

Eu queria que o código convertesse todos os caracteres em strings para maiúsculas ou minúsculas em Java.

Eu encontrei um método que é algo como isto:

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

Agora eu li que usando certos Locale s, como o turco, “retorna i (sem ponto) em vez de i (com ponto) .”

É seguro usar locais como o Reino Unido, EUA, INGLÊS, etc.? Existem grandes diferenças entre eles quando aplicados a strings?

Qual é o Locale mais preferido para String s?

Eu acho que você deveria usar o local

Por exemplo, “TITLE” .toLowerCase () em um idioma turco retorna “tıtle”, onde ‘ı’ é o caractere LATIN SMALL LETTER DOTLESS I. Para obter resultados corretos para cadeias de caracteres insensíveis a localidade, use toLowerCase (Locale.ENGLISH).

Refiro-me a estes links como solução para o seu problema e é importante ter em mente em sua situação “turca”

 **FROM THE LINKS** 

toLowerCase () respeita a internacionalização (i18n). Ele realiza a conversão do caso em relação ao seu local. Quando você chama toLowerCase (), internamente toLowerCase (Locale.getDefault ()) está sendo chamado. É localmente sensível e você não deve escrever uma lógica em torno dele interpretando o código de idioma independentemente.

 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ı` } } 

No programa acima, observe o tamanho da string antes e depois da conversão. Será 1 e 3. Sim, o comprimento da string antes e depois da conversão de maiúsculas e minúsculas é diferente. Sua lógica vai dar um lance quando você depende do tamanho da string neste cenário. Quando seu programa é executado em um ambiente diferente, ele pode falhar. Esta será uma boa captura na revisão de código.

Para torná-lo mais seguro, você pode usar outro método paraLowerCase (Locale.English) e replace a localidade para inglês sempre. Mas então você não está internacionalizado.

Portanto, o ponto crucial é que toLowerCase () é específico do código do idioma.

referência 1
referência 2
referência 3

Sem ponto-i, é um ‘i’ minúsculo sem ponto. A maiúscula desse caractere é o usual “eu”. Há outro personagem, “eu com ponto”. A minúscula desse caractere é o “i” minúsculo comum.

Você já notou o problema? Esta conversão não simétrica causa um problema sério na programação. Enfrentamos esse problema principalmente em aplicativos Java devido à implementação (IMHO) deficiente das funções toLowerCase e toUpperCase.

Em Java, o método String.toLowerCase () converte caracteres em minúsculas de acordo com a localidade padrão. Isso causa problemas se seu aplicativo funcionar no idioma turco e especialmente se você estiver usando essa function para um nome de arquivo ou um URL que deve obedecer a um determinado conjunto de caracteres.

Já escrevi sobre dois exemplos sérios antes: Os erros de compilation com bibliotecas de Script com “i” em seus nomes e a falha do Gerenciador de XSP se uma XPage estiver em um database com “I” em seu nome.

Há uma longa história, como eu disse. Por exemplo, em alguma versão R7, o roteador não conseguiu enviar uma mensagem para um destinatário se o nome dele / dela começar com “I”. Os agentes de relatórios de mensagens não estavam sendo executados na região turca até o R8. Qualquer pessoa com localidade turca não pôde instalar o Lotus Notes 8.5.1 (é real!). A lista continua…

Não há quase nenhum beta tester da Turquia e os clientes não abrem o PMR para esses problemas. Portanto, esses problemas não estão chegando à primeira prioridade das equipes de desenvolvimento.

Até mesmo a equipe Java adicionou um aviso especial à documentação mais recente:

Esse método é sensível à localidade e pode produzir resultados inesperados se usado para seqüências que devem ser interpretadas localmente independentemente. Exemplos são identificadores de linguagem de programação, chaves de protocolo e tags HTML. Por exemplo, “TITLE” .toLowerCase () em um idioma turco retorna “tıtle”, onde ‘ı’ é o caractere LATIN SMALL LETTER DOTLESS I. Para obter resultados corretos para cadeias de caracteres insensíveis a localidade, use toLowerCase (Locale.ENGLISH).

POR FAVOR, LEIA AS LINKS QUE EU POSSO POSTAR TODO O TI “ESTE É RESPONDER AO SEU COMENTÁRIO”

 String str = "CyBeRdRaGoN"; str = str.toLowerCase(); // str = "cyberdragon" str = str.toUpperCase(); // str = "CYBERDRAGON" 

Seu aplicativo irá escolher a localidade padrão, por isso, se alguém executar seu aplicativo em turco com localidade turca, ele verá i sem ponto

Você pode criar uma localidade apropriada para o idioma da sua String .

Por exemplo:

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

vai fazer o truque para o turco.

Se você estiver usando essa function para verificar uma seqüência de caracteres (por exemplo, pesquisa) É seguro usar as seqüências de caracteres em um formulário em minúsculas ou maiúsculas para verificar. Você pode usá-lo assim:

 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... } 

Eu enfrento o mesmo problema, mas em um caso de pesquisa no listview. Eu adicionei esta resposta que pode ajudar alguém que tem o mesmo problema.