Bom dia,
Estou com um problema na acentuação no eclipse, ja alterei o encoding text e tudo mais e até resolveu em determinada situação, mas o caso é o seguinte, estou usando geolocalização atraves dos webservices do google, esses webservices me retornam um XML que é onde eu pego a cidade pela qual o usuario esta acessando meu site e a partir dessa cidade capturada eu redireciono a home do meu site para a url/cidade, que é para eu poder trabalhar os dados que exibirei para aquele usuario de acordo com a localização dele, tipo um peixe urbano da vida, enfim, digamos que a cidade capturada seja são paulo, o problema que esta ocorrendo é que preciso tirar o acento e transformar isso em sao-paulo mas tentei cidade.replace(“ã”,“a”); e nao funcionou, ae dei um system.out.print(cidade) e saiu impresso no console “S??o Paulo”. Ok a partir disto tentei mudar o encoding da palavra para tudo quanto eh tipo e nada funciona, nao sei mais o que fazer, alguem tem alguma ideia de como me ajudar?
Já tentou remover os acentos com algum método utilitário? Não sei dizer se vai funcionar. Algo assim:public static String removerAcentos(String str){
return Normalizer.normalize(str, Normalizer.Form.NFD).replaceAll("[^\\p{ASCII}]", "");
}
[quote=Rodrigo Sasaki]Já tentou remover os acentos com algum método utilitário? Não sei dizer se vai funcionar. Algo assim:public static String removerAcentos(String str){
return Normalizer.normalize(str, Normalizer.Form.NFD).replaceAll("[^\\p{ASCII}]", "");
}
[/quote]
Bom dia Rodrigo, entao cara, ja havia tentado esse metodo, inclusive é o q eu uso normalmente para retirar acentuação, mas ao inves de retirar o acento neste caso citado, este metodo remove a letra inteira, ficando so paulo
Então você realmente precisa acertar o encoding
Por que não usa uma dessas ferramentas HTTP do browser pra descobrir o encoding da resposta? Provavelmente está nos headers.
entao, o xml de exemplo é este: http://maps.googleapis.com/maps/api/geocode/xml?latlng=-23.4531013,-46.6145920&sensor=false&language=pt_br®ion=br
olhando o encoding dele aparentemente é UTF-8, mas se fosse realmente isso eu nao teria problema, pq UTF-8 sei resolver, por algum motivo esta vindo com um encoding diferente.
Obs: nesse XML do link, não só sao paulo como qualquer palavra acentuada apresenta o problema
Cara, eu li ele como UTF-8 e não tive problemas de encoding, usei o seguinte código: public static void main(String[] args) {
BufferedReader br = null;
Reader decoder = null;
try{
URL url = new URL(
"http://maps.googleapis.com/maps/api/geocode/xml?latlng=-23.4531013,-46.6145920&sensor=false&language=pt_br®ion=br");
InputStream is = url.openStream();
decoder = new InputStreamReader(is, "UTF-8");
BufferedReader buffered = new BufferedReader(decoder);
String line = "";
while ((line = buffered.readLine()) != null){
System.out.println(line);
}
} catch (IOException e){
e.printStackTrace();
} finally{
try{
if (br != null)
br.close();
if (decoder != null){
decoder.close();
}
} catch (IOException e){
e.printStackTrace();
}
}
}
Realmente, testei seu codigo e ele nao apresentou problemas, porem queria saber se vc consegue me ajudar a adaptar este seu codigo para me devolver apenas um determinado valor do xml, que é o que acontece no codigo que estou usando agora, ele me retorna só são paulo, que é o que eu preciso, segue abaixo o codigo que estou usando agora, e que por algum motivo esta apresentando problemas com a acentuação:
public String[] capturaCidade(VRaptorRequest request) {
//Locale.setDefault(new Locale("pt", "BR"));
String[] localidade = new String[2];
String latitude = "-23.4531013";
String longitude = "-46.6145920";
try{
if(cookie(request, "latitude") != null) {
latitude = cookie(request, "latitude");
longitude = cookie(request, "longitude");
}
}catch(Exception e){System.out.println(e);}
String outputResult = "";
String urlString = "http://maps.googleapis.com/maps/api/geocode/xml?latlng="+latitude+","+longitude+"&sensor=false&language=pt_br®ion=br";
try {
URL urlGoogleDirService = new URL(urlString);
HttpURLConnection urlGoogleDirCon = (HttpURLConnection) urlGoogleDirService.openConnection();
urlGoogleDirCon.setAllowUserInteraction(false);
urlGoogleDirCon.setDoInput(true);
urlGoogleDirCon.setDoOutput(false);
urlGoogleDirCon.setUseCaches(true);
urlGoogleDirCon.setRequestMethod("GET");
urlGoogleDirCon.connect();
try {
OutputStream output = new OutputStream() {
private StringBuilder string = new StringBuilder();
@Override
public void write(int b) throws IOException {
this.string.append((char) b);
}
@Override
public String toString() {
return this.string.toString();
}
};
byte buf[] = new byte[1024];
int len;
while ((len = urlGoogleDirCon.getInputStream().read(buf)) > 0) {
output.write(buf, 0, len);
}
output.close();
urlGoogleDirCon.getInputStream().close();
outputResult = output.toString();
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(outputResult));
Document doc = db.parse(is);
XPath xPath = XPathFactory.newInstance().newXPath();
//cidade
XPathExpression expr = xPath.compile("//GeocodeResponse/result/address_component[type/text()='locality']/long_name/text()");
Object durationNodeList = expr.evaluate(doc, XPathConstants.NODESET);
NodeList durationNodes = (NodeList) durationNodeList;
//int durationLength = durationNodes.getLength();
localidade[0] = removeAcentos(durationNodes.item(0).getNodeValue());
XPath xPath1 = XPathFactory.newInstance().newXPath();
//estado
XPathExpression expr1 = xPath1.compile("//GeocodeResponse/result/address_component[type/text()='administrative_area_level_1']/long_name/text()");
Object distanceNodeList = expr1.evaluate(doc, XPathConstants.NODESET);
NodeList distanceNodes = (NodeList) distanceNodeList;
//int distanceLenght = distanceNodes.getLength();
localidade[1] = removeAcentos(distanceNodes.item(0).getNodeValue());
} catch (IOException e) {
e.printStackTrace();
}
urlGoogleDirCon.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
return localidade;
};
Por que você está lendo assim? Por que não utiliza Readers e Writers?
Entao, esse codigo ae foi uma recomendação do proprio google, achei q fosse a melhor solução, e particularmente nao tenho muita experiencia em ler xml, essa eh minha primeira empreitada, nem sei como ler uma tag especifica de xml usando readers como vc falou. vc tem algum exemplo?
O que eu postei é um exemplo
Ah sim, mas o seu exemplo le o arquivo xml inteiro e não separa pelas tags.
Mas você faz isso só depois… quando você faz output.toString()
Gere a String do XML com o código que eu postei, e a partir daí pode usar o seu mesmo.
AHH entendi, vou tentar aqui, muito obrigado mesmo pela ajuda
Sem problemas, se tiver mais alguma dúvida aí é só postar
Voltei huauha.
Entao cara, embuti o seu metodo no meu e fiz tudo rodar, porem, o problema continuou o mesmo, ae acabei descobrindo que o problema esta em apenas uma linha, e independe de eu utilizar o metodo na minha versao ou com o codigo que vc me mandou. O problema esta justamente no output.write(line.getBytes(“UTF-8”)); Eu dei um print no xml antes de rodar o output.write e depois de rodar, e para minha surpresa, o q rodou antes sai correto e o q rodou depois sai com todos os acentos quebrados, e nisso voltamos a estaca zero pq ate agora nao consegui resolver de novo, ja tentei tudo quanto é encoding no write, pele menos a estaca zero tem uma linha focada agora uhauha. se tiver mais alguma sugestao eu agradeço a ajuda, de qualquer forma, segue o metodo como esta agora, com os prints antes e depois do write, se puder rode ele na sua maquina e veja com seus proprios olhos huauha:
public String[] capturaCidade(VRaptorRequest request) {
String[] localidade = new String[2];
String latitude = "-23.4531013";
String longitude = "-46.6145920";
try{
if(cookie(request, "latitude") != null) {
latitude = cookie(request, "latitude");
longitude = cookie(request, "longitude");
}
}catch(Exception e){System.out.println(e);}
String outputResult = "";
BufferedReader br = null;
Reader decoder = null;
try{
URL url = new URL("http://maps.googleapis.com/maps/api/geocode/xml?latlng="+latitude+","+longitude+"&sensor=false&language=pt_br®ion=br");
InputStream is = url.openStream();
decoder = new InputStreamReader(is, "UTF-8");
BufferedReader buffered = new BufferedReader(decoder);
String line = "";
OutputStream output = new OutputStream() {
private StringBuilder string = new StringBuilder();
@Override
public void write(int b) throws IOException {
this.string.append((char) b);
}
@Override
public String toString() {
return this.string.toString();
}
};
while ((line = buffered.readLine()) != null){
System.out.println(line);
output.write(line.getBytes("UTF-8"));
}
output.close();
outputResult = output.toString();
System.out.println(outputResult);
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
InputSource in = new InputSource();
in.setCharacterStream(new StringReader(outputResult));
Document doc = db.parse(in);
//cidade
XPath xPath = XPathFactory.newInstance().newXPath();
XPathExpression expr = xPath.compile("//GeocodeResponse/result/address_component[type/text()='locality']/long_name/text()");
Object durationNodeList = expr.evaluate(doc, XPathConstants.NODESET);
NodeList durationNodes = (NodeList) durationNodeList;
localidade[0] = durationNodes.item(0).getNodeValue();
//estado
XPath xPath1 = XPathFactory.newInstance().newXPath();
XPathExpression expr1 = xPath1.compile("//GeocodeResponse/result/address_component[type/text()='administrative_area_level_1']/long_name/text()");
Object distanceNodeList = expr1.evaluate(doc, XPathConstants.NODESET);
NodeList distanceNodes = (NodeList) distanceNodeList;
localidade[1] = distanceNodes.item(0).getNodeValue();
} catch (IOException e){ e.printStackTrace();
} catch (ParserConfigurationException e) {e.printStackTrace();
} catch (SAXException e) {e.printStackTrace();
} catch (XPathExpressionException e) {e.printStackTrace();
} finally{
try{
if (br != null)
br.close();
if (decoder != null){
decoder.close();
}
} catch (IOException e){
e.printStackTrace();
}
}
return localidade;
};