如何修复1字节UTF-8序列的无效字节1

问题描述 投票:25回答:10

我试图使用java方法从db获取以下xml,但我收到一个错误

用于解析xml的代码

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();

InputSource is = new InputSource(new ByteArrayInputStream(cond.getBytes()));

Document doc = db.parse(is);

Element elem = doc.getDocumentElement();

// here we expect a series of <data><name>N</name><value>V</value></data>
NodeList nodes = elem.getElementsByTagName("data");

TableID jobId = new TableID(_processInstanceId);
Job myJob = Job.queryByID(_clientContext, jobId, true);

if (nodes.getLength() == 0) {
    log(Level.DEBUG, "No data found on condition XML");

}

for (int i = 0; i < nodes.getLength(); i++) {
    // loop through the <data> in the XML

    Element dataTags = (Element) nodes.item(i);
    String name = getChildTagValue(dataTags, "name");
    String value = getChildTagValue(dataTags, "value");

    log(Level.INFO, "UserData/Value=" + name + "/" + value);

    myJob.setBulkUserData(name, value);
}

myJob.save();

数据

<ContactDetails>307896043</ContactDetails>
<ContactName>307896043</ContactName>
<Preferred_Completion_Date>
</Preferred_Completion_Date>
<service_address>A-End Address: 1ST HELIERST HELIERJT2 3XP832THE CABLES 1 POONHA LANEST HELIER JE JT2 3XP</service_address>
<ServiceOrderId>315473043</ServiceOrderId>
<ServiceOrderTypeId>50</ServiceOrderTypeId>
<CustDesiredDate>2013-03-20T18:12:04</CustDesiredDate>
<OrderId>307896043</OrderId>
<CreateWho>csmuser</CreateWho>
<AccountInternalId>20100333</AccountInternalId>
<ServiceInternalId>20766093</ServiceInternalId>
<ServiceInternalIdResets>0</ServiceInternalIdResets>
<Primary_Offer_Name  action='del'>MyMobile Blue &#163;44.99 [12 month term]</Primary_Offer_Name>
<Disc_Reason  action='del'>8</Disc_Reason>
<Sup_Offer  action='del'>80000257</Sup_Offer>
<Service_Type  action='del'>A-01-00</Service_Type>
<Priority  action='del'>4</Priority>
<Account_Number  action='del'>0</Account_Number>
<Offer  action='del'>80000257</Offer>
<msisdn  action='del'>447797142520</msisdn>
<imsi  action='del'>234503184</imsi>
<sim  action='del'>5535</sim>
<ocb9_ARM  action='del'>false</ocb9_ARM>
<port_in_required  action='del'>
</port_in_required>
<ocb9_mob  action='del'>none</ocb9_mob>
<ocb9_mob_BB  action='del'>
</ocb9_mob_BB>
<ocb9_LandLine  action='del'>
</ocb9_LandLine>
<ocb9_LandLine_BB  action='del'>
</ocb9_LandLine_BB>
<Contact_2>
</Contact_2>
<Acc_middle_name>
</Acc_middle_name>
<MarketCode>7</MarketCode>
<Acc_last_name>Port_OUT</Acc_last_name>
<Contact_1>
</Contact_1>
<Acc_first_name>.</Acc_first_name>
<EmaiId>
</EmaiId>

错误

 org.apache.xerces.impl.io.MalformedByteSequenceException: Invalid byte 1 of 1-byte UTF-8 sequence.

我读了一些线程,因为xml中有一些特殊的字符。如何解决这个问题?

java xml xml-parsing
10个回答
18
投票

如何解决这个问题?

使用正确的字符编码读取数据。错误消息表示您尝试将数据读取为UTF-8(故意或因为这是未指定<?xml version="1.0" encoding="somethingelse"?>的XML文件的默认编码)但实际上它采用的是不同的编码,例如ISO-8859- 1或Windows-1252。

为了能够就如何执行此操作提供建议,我必须查看您当前用于读取XML的代码。


0
投票

我遇到过同样的问题。我的问题是它在WebLogic服务器的statWeblogic.cmd文件中的JAVA_OPTION下缺少“-Dfile.encoding = UTF8”参数。


17
投票
  1. 在记事本中打开xml
  2. 确保文档的开头和结尾没有多余的空间。
  3. 选择文件 - >另存为
  4. 选择保存类型 - >所有文件
  5. 输入文件名为abcd.xml
  6. 选择编码 - UTF-8 - >单击保存

7
投票

尝试:

InputStream inputStream= // Your InputStream from your database.
Reader reader = new InputStreamReader(inputStream,"UTF-8");

InputSource is = new InputSource(reader);
is.setEncoding("UTF-8");

saxParser.parse(is, handler);

如果它不是UTF-8,只需更改好的编码部分即可。


3
投票

我将xml作为String并使用xml.getBytes()并获取此错误。更改为xml.getBytes(Charset.forName(“UTF-8”))为我工作。


1
投票

我遇到了这个问题,但文件是UTF-8,只是在某种程度上,字符已经进入,而不是以UTF-8编码。为了解决这个问题,我做了这个帖子中所说的内容,即我验证了文件:How to check whether a file is valid UTF-8?

基本上你运行命令:

$ iconv -f UTF-8 your_file -o / dev / null

如果有些东西没有用UTF-8编码,它会给你行号和行号,以便你可以找到它。


0
投票

由于Ant构建,我碰巧遇到了这个问题。

Ant构建文件并将filterchain expandproperties应用于它。在此文件筛选期间,我的Windows机器的隐式默认非UTF-8字符编码用于生成筛选文件 - 因此无法正确映射其字符集之外的字符。

一种解决方案是为Ant提供UTF-8的显式环境变量。在Cygwin中,在启动Ant:export ANT_OPTS="-Dfile.encoding=UTF-8"之前。


0
投票

我遇到了同样的问题,经过长时间调查我的XML文件,我发现了问题:很少有非转义字符,如« »


0
投票

像我这样理解字符编码原理的人,also read Joel's article这很有趣,因为它contains wrong characters anyway仍然无法弄清楚是什么(剧透警报,我是Mac用户)然后你的解决方案可以像删除你的本地回购和克隆一样简单它再次。

我的代码库自从上次运行以来没有改变,所以由于我们的构建系统从不抱怨它,所以没有任何意义可能会出现UTF错误....直到我记得我几天前不小心拔掉了我的电脑使用IntelliJ Idea和整个运行(Java / Tomcat / Hibernate)

我的Mac做了很棒的工作,假装没有发生任何事情,我像往常一样继续经营,但基础文件系统在某种程度上被破坏了。浪费了一整天试图弄清楚这个。我希望它对某人有所帮助。


0
投票

我在我的JSF应用程序中遇到了同样的问题,该应用程序的注释行包含XMHTL页面中的一些特殊字符。当我在我的日食中比较以前的版本它有一个评论,

//Some �  special characters found

删除了那些字符并加载了正确的页面。它主要与XML文件有关,因此请将其与工作版本进行比较。

© www.soinside.com 2019 - 2024. All rights reserved.