Caractere não reconhecido

Bom dia pessoal,

gostaria de compartilhar um problema com todos.

Tenho um projeto que gerencia os conteúdos de nosso portal.

Esse projeto tem um módulo de criação de páginas que disponibiliza
todas as informações que devem ser preenchidas pelos escritores.

Mas um problema muito sério que estou passando é da existencia
de um desgraçado caractere proveniente do word chamado de
travessão.

Em html esse travessão é reconhecido pelo comando ndash;
Maaaaas ai que é o problema… tenho várias páginas que estão
simplesmente com o tal travessão… sem a cláusula html…

fiz um código para me listar dentre uma string os inteiros ascii
para tentar identificar o bendito…

para minha surpresa esse carac não é identificado na tabela ascii
e é associado ao mesmo carac da interrogação, ou seja:

Na String texto com conteúdo “Abc – Def – ??? $ % @”
o Java identifica os inteiros assim para o travessão e a interrogação:

63 ? <-- Travessão
63 ? <-- Interrogação de verdade

Não sei se fui claro… espero que sim…

A dúvida é… como eu faço para identificar esse feliz travessão como sendo um
travessão?!?! ou também um hiffen grande hehehehe

Alguém já passou por isso?!?!?

Desde já obrigado

Tiago

O tal travessão - Unicode U+2014, “Em dash” , ou “—”, não está sendo corretamente convertido. É problema de “encoding”. Provavelmente as páginas não estão sendo salvas como UTF-8 ou Unicode, mas em ISO-8859-1, onde esse caracter não existe, e é transformado pelo Java para “?”.

Então Thingol,

Eu achei isso mesmo só que fiz os testes em meu console entendeu!??!

Não era para ter problemas de encoding… ou não?

Olha só o teste…

String texto = “Abc – Def – int ??? $ % @”;

for( int i = 0; i < texto.length(); i++ )
System.out.println((int)texto.charAt(i)+" "+(char)texto.charAt(i));

E o resultado foi aquele entende?
É no minimo confuso isso pq eu entendo que ele deveria ter qualquer código menos não ser
interpretado…

Mas vamos continuar…

Abraço

Você não fez o teste corretamente. Vou postar o teste “correto”.

class TesteTravessao {
    public static void main(String[] args) {
        // Estou pondo uma interrogação, um travessão (Unicode U+2014, "Em dash"), e um hífen.
        // No Windows, pegue um "Command Prompt", escolha no menu "Properties", tab "Font", a fonte Lucida Console,
        // então dê o comando "chcp 1252" e vai ver o travessão direitinho.
        // Note que você também usou um caracter chamado "En dash", U+2013. Esse caracter pode ser codificado em
        // Windows-1252.
        // Saída esperada:
/*
&lt;pre&gt;
65 A
98 b
99 c
32
8211 –
32
68 D
101 e
102 f
32
8211 –
32
63 ?
8212 —
45 -
32
36 $
32
37 %
32
64 @
&lt;/pre&gt;
 */        
        String texto = &quot;Abc – Def – ?\u2014- $ % @&quot;;
        for (int i = 0; i &lt; texto.length(); i++) {
            System.out.println((int)texto.charAt(i)+&quot; &quot;+(char)texto.charAt(i)); 
        }
    }
}

Thingol,

Eu uso o Linux tanto no desenvolvimento quanto na produção.

Fiz o teste que você passou e deu a mesma coisa…

Teria alguma solução conhecida para o linux?!?

Valeu pela força

Bom…

Estou pesquisando desde cedo sobre o assunto…
Resolvi mudar o charset da minha máquina mas isso não foi legal…

Então resolvi o seguinte…

public String toUTF8(String isoString) { 
     String utf8String = null; 
     if (null != isoString && !isoString.equals("")) 
     { 
         try 
         { 
             byte[] stringBytesISO = isoString.getBytes("ISO-8859-1"); 
             utf8String = new String(stringBytesISO, "UTF-8"); 
         } 
         catch(UnsupportedEncodingException e) 
         { 
             // Mostra exceção mas devolve a mesma String 
             System.out.println("UnsupportedEncodingException: " + e.getMessage()); 
             utf8String = isoString; 
         } 
     } 
     else 
     { 
         utf8String = isoString; 
     } 
     return utf8String; 
 }

Fonte retirada aqui mesmo do guj ( http://www.guj.com.br/posts/list/12456.java ).

Apliquei a função na minha main() desta forma:

TesteFinal tf = new TesteFinal();
		 
		String string = "ABC - \u2014 – WXZ";
	
		String texto = tf.toUTF8(string);
		System.out.println(texto);
		for( int i = 0; i < texto.length(); i++ )
			System.out.println((int)texto.charAt(i)+" "+(char)texto.charAt(i));

E para minha tristeza o resultado foi

Já fiz tudo o que achava que poderia fazer…

Peço a ajuda de voces mais uma vez…

Abraço