关于 Invalid byte 1 of 1-byte UTF-8 sequence

lost_guy_in_scut 2012-07-05 03:24:17
不知各位有没遇到过这样的问题呢?
问题描述:像一个url请求,获取得到的参数response如下

<?xml version='1.0' encoding='UTF-8'?><applyPrivilegeRet><formnum>100010</formnum><retn>-1</retn><desc>用户已经开通XXX套餐,不需要重复开通</desc><packages><opertype>1</opertype><privID>122216</privID><startdate>20120705</startdate></packages></applyPrivilegeRet>

通过以下代码解析该返回值,


/**
* 将xml输入流转成map对象
* @param in -- xml输入流
* @return -- map对象
*/
public static Map toMap(InputStream in) {

try {
SAXReader reader = new SAXReader();
Document doc = reader.read(in);
return toMap(doc.getRootElement());
} catch (Exception ex) {
throw new RuntimeException("解析xml成map对象异常", ex);
}
}
public static Map toMap(String xml) {
ByteArrayInputStream sin = new ByteArrayInputStream(xml.getBytes());
return toMap(sin);
}

public MyTest(String xml){
toMap(response);
}

在两台linux服务器上,一台解析是没有任何问题的,另外一台出现java.lang.RuntimeException: 解析xml成map对象异常
at com.aspire.commons.util.XmlUtil.toMap(XmlUtil.java:46)
at com.aspire.commons.util.XmlUtil.toMap(XmlUtil.java:31)
at com.aspire.boss.servlet.SubscribeFromBossServlet.parseApplyPrivilege(SubscribeFromBossServlet.java:203)
at com.aspire.boss.servlet.SubscribeFromBossServlet.applyToHuawei(SubscribeFromBossServlet.java:366)
at com.aspire.boss.servlet.SubscribeFromBossServlet.doPost(SubscribeFromBossServlet.java:106)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:538)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:478)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:480)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:225)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:937)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:406)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:183)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:871)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:247)
at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:110)
at org.eclipse.jetty.server.Server.handle(Server.java:346)
at org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:589)
at org.eclipse.jetty.server.HttpConnection$RequestHandler.content(HttpConnection.java:1065)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:823)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:220)
at org.eclipse.jetty.server.HttpConnection.handle(HttpConnection.java:411)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:535)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:40)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:529)
at java.lang.Thread.run(Thread.java:662)
Caused by: org.dom4j.DocumentException: Invalid byte 1 of 1-byte UTF-8 sequence. Nested exception: Invalid byte 1 of 1-byte UTF-8 sequence.
at org.dom4j.io.SAXReader.read(SAXReader.java:484)
at org.dom4j.io.SAXReader.read(SAXReader.java:343)
at com.aspire.commons.util.XmlUtil.toMap(XmlUtil.java:43)

环境说明:两台linux服务器,用了同样的jdk,都是用jetty7。

好纠结~~~
...全文
1019 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
巽谷雨 2012-07-06
  • 打赏
  • 举报
回复
是不是第二台机子的环境编码和程序里的编码不一样
lost_guy_in_scut 2012-07-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

是不是第二台机子的环境编码和程序里的编码不一样
[/Quote]
是的,已经解决了。
lost_guy_in_scut 2012-07-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

或者
ByteArrayInputStream sin = new ByteArrayInputStream(xml.getBytes());
改成
ByteArrayInputStream sin = new ByteArrayInputStream(xml.getBytes("UTF-8"));
试试
[/Quote]
这个我也试过,还是不行,哈。照理说这个起的作用和修改linux编码是一样的,可是不知道为什么不可以,求解释~~~
lost_guy_in_scut 2012-07-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

应该又是编码问题,中文读取错误了。

<?xml version='1.0' encoding='UTF-8'?>这里指定encoding是UTF-8,但实际传递的可能是GBK编码。

改成,<?xml version="1.0" encoding="GB2312"?>试一试行不行。
[/Quote]
嗯,是编码问题,两台linux机子的lang属性不同,一台是gbk,一台是utf-8,对方接口返回的是utf-8格式的,修改linux的lang属性就可以了~~~
brightyq 2012-07-05
  • 打赏
  • 举报
回复
或者
ByteArrayInputStream sin = new ByteArrayInputStream(xml.getBytes());
改成
ByteArrayInputStream sin = new ByteArrayInputStream(xml.getBytes("UTF-8"));
试试
brightyq 2012-07-05
  • 打赏
  • 举报
回复
应该又是编码问题,中文读取错误了。

<?xml version='1.0' encoding='UTF-8'?>这里指定encoding是UTF-8,但实际传递的可能是GBK编码。

改成,<?xml version="1.0" encoding="GB2312"?>试一试行不行。
lost_guy_in_scut 2012-07-05
  • 打赏
  • 举报
回复
写错了
public MyTest(String xml){
toMap(response);
} 应该为
public MyTest(response){
toMap(response);
}
可以理解为该程序唯一实现的功能是调用Mytest(response)函数,response即是之前所提及的内容。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧