terça-feira, 17 de abril de 2007

Caracteres especiais representados em Unicode

Para evitar problemas com encoding de caracteres especiais é bom utilizar em suas classes Java código unicode ao invés de letras acentuadas. Abaixo relaciono uma tabela de alguns dos caracteres especiais que mais usamos no dia a dia com seu cógigo unicode:
á = \u00e1
à = \u00e0
â = \u00e2
ã = \u00e3
ä = \u00e4
Á = \u00c1
À = \u00c0
 = \u00c2
à = \u00c3
Ä = \u00c4
é = \u00e9
è = \u00e8
ê = \u00ea
ê = \u00ea
É = \u00c9
È = \u00c8
Ê = \u00ca
Ë = \u00cb
í = \u00ed
ì = \u00ec
î = \u00ee
ï = \u00ef
Í = \u00cd
Ì = \u00cc
Î = \u00ce
Ï = \u00cf
ó = \u00f3
ò = \u00f2
ô = \u00f4
õ = \u00f5
ö = \u00f6
Ó = \u00d3
Ò = \u00d2
Ô = \u00d4
Õ = \u00d5
Ö = \u00d6
ú = \u00fa
ù = \u00f9
û = \u00fb
ü = \u00fc
Ú = \u00da
Ù = \u00d9
Û = \u00db
ç = \u00e7
Ç = \u00c7
ñ = \u00f1
Ñ = \u00d1
& = \u0026
' = \u0027
Para colocar o código Unicode em uma String basta substituir o caracter pelo código. Exemplo: String s = "Programando sem cafe\u00edna";

O código do método que usei para gerar essa tabela está abaixo:
public static String geraCodigoUnicode(char letra) {
String hexa = Integer.toHexString( (int)letra );

String prefix;
if( hexa.length() == 1 ) {
prefix = "\\u000";
} else if( hexa.length() == 2 ) {
prefix = "\\u00";
} else if( hexa.length() == 3 ) {
prefix = "\\u0";
} else {
prefix = "\\u";
}

return prefix + hexa;
}

15 comentários:

  1. Tiago, belo artigo! Me salvou de um problema especifico aqui! keep on!

    ResponderExcluir
  2. Olá Tiago,

    Adicionei ao meu blog o link deste post. Desculpe por não ter publicado seu nome antes.

    URL: http://dougsland.livejournal.com/56885.html

    ResponderExcluir
  3. Muito bom! Utilizo esta tabela há anos e nunca falha para alerts em Javascript + PHP!

    ResponderExcluir
  4. Quem quiser está ai o método do amigo traduzido para PHP:

    public function geraCodigoUnicode($char) {
    $hexa = dechex(ord($char));
    if( strlen($hexa) == 1 ) {
    $prefix = "\\u000";
    } else if( strlen($hexa) == 2 ) {
    $prefix = "\\u00";
    } else if( strlen($hexa) == 3 ) {
    $prefix = "\\u0";
    } else {
    $prefix = "\\u";
    }
    return $prefix.$hexa;
    }

    ResponderExcluir
  5. Muito bom, resolveu meus problemas de acentuação nas caixas de alerta, seria interessante transformar isso em uma função onde o PHP selecionasse o texto e substituísse os caracteres acentuados por esses códigos. Vou publicar no meu blog também. Parabéns!

    ResponderExcluir
  6. Para usar nos caixas de javascript pode-se usar o comando "json_encode" em uma varíavel:
    $palavra = substr(json_encode("Açúcar\nUnião"),1,-1);

    ou aplicá-la diretamente na mensagem do alert box:
    alert('');

    O substr é para retirar as aspas inseridas pelo comando json.

    ResponderExcluir
  7. Esse exemplo usando o hexa é otimo e evita 30 String::replace e criação de inumeros objetos no heap/stack. Abaixo uma implementação semelhante usando bitewise:

    int hs = (int) c >> 8;
    int ls = hs & 0x00FF;

    String highSide = Integer.toHexString(hs);
    String lowSide = Integer.toHexString(ls);
    String hexa = Integer.toHexString( (int) c );

    System.out.println(c+" = "+"\\u"+highSide+lowSide+hexa);

    ResponderExcluir