web-dev-qa-db-ja.com

1バイトUTF-8シーケンスの無効なバイト1を修正する方法

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のいくつかの特殊文字のためです。この問題を修正するには?

26
shaiksha

この問題を修正するには?

正しい文字エンコードを使用してデータを読み取ります。エラーメッセージは、データをUTF-8として読み取ろうとしていることを意味します(意図的に、または<?xml version="1.0" encoding="somethingelse"?>を指定しないXMLファイルのデフォルトエンコーディングであるため)、実際には次のような異なるエンコーディングになっていますISO-8859-1またはWindows-1252。

これを行う方法についてアドバイスできるようにするには、XMLの読み取りに現在使用しているコードを確認する必要があります。

18
Ian Roberts
  1. メモ帳でxmlを開きます
  2. ドキュメントの最初と最後に余分なスペースがないことを確認してください。
  3. ファイル->名前を付けて保存を選択します
  4. タイプとして保存->すべてのファイルを選択します
  5. ファイル名をabcd.xmlとして入力します
  6. エンコードを選択-UTF-8->保存をクリック
17
Barani r

試してください:

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以外の場合は、エンコード部分を適切なものに変更してください。

7
LaGrandMere

Xmlを文字列として取得し、xml.getBytes()を使用してこのエラーを取得していました。 xml.getBytes(Charset.forName( "UTF-8"))に変更するとうまくいきました。

3
John

私はこの問題を抱えていましたが、ファイルはUTF-8で、UTF-8でエンコードされていない文字が何らかの形で入っていただけです。問題を解決するために、このスレッドに記載されていること、つまりファイルを検証しました: ファイルが有効なUTF-8であるかどうかを確認する方法?

基本的にコマンドを実行します:

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

また、UTF-8でエンコードされていないものがある場合は、行番号と行番号が提供されるため、見つけることができます。

1
Robert Sjödahl

文字エンコードの原則を理解している私のような人 Joelの記事も読んでください これは面白い とにかく間違った文字を含む およびそれでもできないheck(スポイラーアラート、私はMacユーザーです)を把握したら、ローカルリポジトリを削除して再度クローンを作成するだけで解決できます

私のコードベースは前回正常に実行されてから変更されていないため、ビルドシステムがそれについて文句を言わなかったという事実を考えると、UTFエラーを持っていることは意味がありませんでした... IntelliJ Ideaおよび実行中のすべて(Java/Tomcat/Hibernate)

私のMacは、何もなかったふりをして素晴らしい仕事をし、いつものように仕事を続けましたが、基盤となるファイルシステムは何とか​​破損したままでした。これを理解しようとして一日を無駄にしました。私はそれが誰かを助けることを願っています。

0
felipe

同じ問題がありました。私の問題は、WebLogicサーバーのstatWeblogic.cmdファイルのJava_OPTIONの下に「-Dfile.encoding = UTF8」引数がないことでした。

0
chk.buddi

Antビルドが原因でこの問題に遭遇しました。

そのAntビルドはファイルを受け取り、filterchain expandpropertiesそれに。このファイルフィルタリング中に、Windowsマシンの暗黙的なデフォルトの非UTF-8文字エンコーディングを使用して、フィルタリングされたファイルを生成しました。したがって、その文字セット以外の文字は正しくマッピングできませんでした。

1つの解決策は、AntにUTF-8用の明示的な環境変数を提供することでした。 Cygwinでは、Antを起動する前に:export ANT_OPTS="-Dfile.encoding=UTF-8"

0
Abdull

XMHTLページにいくつかの特殊文字を含むコメント行があるJSFアプリケーションでも同じ問題が発生しました。 Eclipseで以前のバージョンを比較したとき、コメントがありました。

//Some �  special characters found

それらの文字を削除し、ページを正常にロードしました。ほとんどはXMLファイルに関連しているので、実際のバージョンと比較してください。

0
Lucky

私は同じ問題に遭遇し、XMLファイルの長い調査の後、問題を見つけました:«»のようなエスケープされていない文字はほとんどありませんでした。

0