Google应用程序引擎-Java-阅读post请求时,特殊字符会被更改
我的谷歌应用引擎servlet处理post请求。 它试图获取XML字符串,但特殊字符被更改。 像å/ä/ö这样的瑞典字符被转换成:Ã¥Google应用程序引擎-Java-阅读post请求时,特殊字符会被更改,java,google-app-engine,servlets,utf-8,character-encoding,Java,Google App Engine,Servlets,Utf 8,Character Encoding,我的谷歌应用引擎servlet处理post请求。 它试图获取XML字符串,但特殊字符被更改。 像å/ä/ö这样的瑞典字符被转换成:Ã¥ public String getXML(HttpServletRequest req){ String XML = ""; try { BufferedReader b = req.getReader(); StringBuffer xmlBuffer = new StringBuffer();
public String getXML(HttpServletRequest req){
String XML = "";
try {
BufferedReader b = req.getReader();
StringBuffer xmlBuffer = new StringBuffer();
while((XML = b.readLine()) != null) {
xmlBuffer.append(XML);
}
XML = xmlBuffer.toString();
} catch (IOException e) {
//maybe later
}
return XML;
}
post数据始终是一个UTF-8的XML字符串,用于验证哈希
编辑问题:2013-12-05
new String(XML.getBytes(),"UTF-8")
您正在重新解释字符串的字节,从到UTF-8
尝试在不进行任何显式转换的情况下读取请求,如下所示:
public String getXML(HttpServletRequest req){
try {
BufferedReader b = req.getReader();
StringBuffer xmlBuffer = new StringBuffer();
String XML;
while((XML = b.readLine()) != null) {
xmlBuffer.append(XML);
}
return xmlBuffer.toString();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
或使用:
getReader()
负责执行任何必要的字符转换,如
读取器根据主体上使用的字符编码来翻译字符数据
我设法(用谷歌)找到了答案。。最后
req.setCharacterEncoding("UTF-8");
public String getXML(HttpServletRequest req) throws IOException{
String input = null;
if ((input = (String) req.getAttribute("com.xp.input")) == null) {
StringBuilder buffer = new StringBuilder();
BufferedReader reader = req.getReader();
String line;
while((line = reader.readLine()) != null){
buffer.append(line);
}
input = buffer.toString();
req.setAttribute("com.xp.input", input);
}
if (input == null) {
return "";
}
String header = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
String body = input.substring(38, input.lastIndexOf('>')+1);
body = body.substring(body.indexOf('<'));
return header+"\n"+body+"\n";
}
req.setCharacterEncoding(“UTF-8”);
公共字符串getXML(HttpServletRequest req)引发IOException{
字符串输入=null;
if((输入=(字符串)req.getAttribute(“com.xp.input”))==null){
StringBuilder缓冲区=新的StringBuilder();
BufferedReader reader=req.getReader();
弦线;
而((line=reader.readLine())!=null){
buffer.append(行);
}
输入=buffer.toString();
req.setAttribute(“com.xp.input”,输入);
}
如果(输入==null){
返回“”;
}
字符串标题=”;
字符串体=input.substring(38,input.lastIndexOf('>')+1);
body=body.substring(body.indexOf)('@rzymek:Just a note:字节到字符的转换仍在进行,但这次读取器考虑了请求编码:@Niklas-ryzemek的代码是正确的。您如何检查字符?请注意,管理控制台没有正确显示UTF-8字符。@PeterKnego我已经检查了getReader()
docs,以确保没有可怕的“平台默认字符集”,但你是对的-我编辑了答案以使其更清晰。@PeterKnego我通过将字符串保存到MemCache来检查数据。我尝试过,现在它可以处理特殊字符。
req.setCharacterEncoding("UTF-8");
public String getXML(HttpServletRequest req) throws IOException{
String input = null;
if ((input = (String) req.getAttribute("com.xp.input")) == null) {
StringBuilder buffer = new StringBuilder();
BufferedReader reader = req.getReader();
String line;
while((line = reader.readLine()) != null){
buffer.append(line);
}
input = buffer.toString();
req.setAttribute("com.xp.input", input);
}
if (input == null) {
return "";
}
String header = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
String body = input.substring(38, input.lastIndexOf('>')+1);
body = body.substring(body.indexOf('<'));
return header+"\n"+body+"\n";
}