亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

處理 xml 文件時的 UTF8 編碼無效

處理 xml 文件時的 UTF8 編碼無效

jeck貓 2022-07-06 18:40:51
我有一個處理 XML 文件以讀取一些值的 Java 代碼。我收到一個錯誤:無效的 UTF8 編碼,我試圖將文件內容復制到 NotePad++ 上的另一個文件中,該過程運行良好,但如果我只將文件另存為其他名稱,則會給出相同的錯誤。抱歉,我不能把我的 XML 文件放在這里,因為它太大了,我只會放 header 和 trailer。感謝您提供任何幫助來解決此錯誤。我處理 xml 文件的 java 代碼:XPathFactory f=XPathFactory.newInstance();    XPath x=f.newXPath();    InputSource source=new InputSource(new FileInputStream("C:\\Users\\cc\\eclipse-workspace\\data\\file.xml") );    InputSource source2=new InputSource(new FileInputStream("C:\\Users\\cc\\eclipse-workspace\\data\\file.xml") );    XPathExpression trlr=x.compile("pers/trailer/text()");    XPathExpression hdr=x.compile("pers/header/CD/text()");    String s=trlr.evaluate(source);    String s2=hdr.evaluate(source2);    System.out.println("header :"+s+" trailer"+s2);pers 是 xml 文件中的根標記:XML 文件如下所示:<?xml version = '1.0' encoding = 'UTF-8'?><pers> <header>555</header> . . . . <trailer>666</trailer></pers>
查看完整描述

2 回答

?
智慧大石

TA貢獻1946條經驗 獲得超3個贊

使用 java 編寫腳本來檢測有問題的行。


AtomicInteger lineno = new AtomicInteger();

Path path = Paths.get("... .xml");

Files.lines(path, StandardCharsets.ISO_8859_1)

    .forEach(line -> {

        int no = lineno.incrementAndGet();

        byte[] b = line.getBytes(StandardCharsets.ISO_8859_1);

        try {

            new String(b, StandardCharsets.UTF_8);

        } catch (Exception e) {

            System.out.printf("[%d] %s%n%s%n", no, line, e.getMessage());

            //throw new IllegalStateException(e);

        }

    });

人們可能會認為這是一個數據錯誤。


一般來說,它也可能是錯誤的緩沖讀?。寒斠粋€多字節序列在緩沖區邊界上被破壞時;然后可能會出現兩個錯誤的半序列。在標準庫代碼中不太可能。


為了確保代碼new String(...)不會被 JVM 丟棄,可能:


int sowhat = Files.lines(path, StandardCharsets.ISO_8859_1)

    .mapToInt(line -> {

        int no = lineno.incrementAndGet();

        byte[] b = line.getBytes(StandardCharsets.ISO_8859_1);

        try {

            return new String(b, StandardCharsets.UTF_8).length();

        } catch (Exception e) {

            System.out.printf("[%d] %s%n%s%n", no, line, e.getMessage());

            throw new IllegalStateException(e); // Must throw or return int

        }

    }).sum();

System.out.println("Ignore this: " + sowhat);

人們可能會認為這是一個數據錯誤。


一般來說,它也可能是錯誤的緩沖讀?。寒斠粋€多字節序列在緩沖區邊界上被破壞時;然后可能會出現兩個錯誤的半序列。在標準庫代碼中不太可能。


為了確保代碼new String(...)不會被 JVM 丟棄,可能:


int sowhat = Files.lines(path, StandardCharsets.ISO_8859_1)

    .mapToInt(line -> {

        int no = lineno.incrementAndGet();

        byte[] b = line.getBytes(StandardCharsets.ISO_8859_1);

        try {

            return new String(b, StandardCharsets.UTF_8).length();

        } catch (Exception e) {

            System.out.printf("[%d] %s%n%s%n", no, line, e.getMessage());

            throw new IllegalStateException(e); // Must throw or return int

        }

    }).sum();

非法的 XML 字符(在 1.0 版中)?[#x1-#x8] | [#xB-#xC] | [#xE-#x1F] | [#x7F-#x84] | [#x86-#x9F]


int sowhat = Files.lines(path, StandardCharsets.ISO_8859_1)

    .mapToInt(line -> {

        int no = lineno.incrementAndGet();

        byte[] b = line.getBytes(StandardCharsets.ISO_8859_1);

        if (!legal(b)) {

            System.out.printf("[%d] %s%n%s%n", no, line, e.getMessage());

            throw new IllegalStateException(e); // Must throw or return int

        }

    }).sum();


static boolean legal(byte[] bytes) {

    String s = new String(bytes, StandardCharsets.UTF_8);

    for (char ch : s.toCharArray()) {

        int x = ch;

        if ((0 <= x && x <= 8)               // ASCII control chars

                || (0xB <= x && x <= 0xC)

                || (0xE <= x && x <= 0x1F)

                || (0x7f <= x && x <= 0x84)  // DEL + Unicode control chars

                || (0x86 <= x && x <= 0x9F)) {

            return false;

        }

    }

    return true;

}

如果這不起作用,我已經讓你足夠長的時間了。拆分文件并驗證零件。


查看完整回答
反對 回復 2022-07-06
?
守著一只汪

TA貢獻1872條經驗 獲得超4個贊

我使用此代碼將文件轉換為 UTF-8 格式:


 File source = new File("C:\\Users\\cc\\eclipse-workspace\\data\\file.xml");

    String srcEncoding="ISO-8859-1";

    File target = new File("C:\\Users\\cc\\eclipse-workspace\\data\\file2.xml");

    String tgtEncoding="UTF-8";

      try (

        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(source), srcEncoding));

        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(target), tgtEncoding)); ) {

            char[] buffer = new char[16384];

            int read;

            while ((read = br.read(buffer)) != -1)

                bw.write(buffer, 0, read);


  }


查看完整回答
反對 回復 2022-07-06
  • 2 回答
  • 0 關注
  • 364 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號