簡體   English   中英

將 XML 從 GCS Blob 存儲轉換為不適用於特殊字符的字符串

[英]Converting an XML from GCS Blob storage to String not working for special characters

我正在嘗試讀取 gcs 存儲桶的內容並解析可能存在的 XML 文件。 除了將非拉丁字母(中文、日文等)的字符轉換為各種錯誤符號外,它工作正常。

首先我得到我的存儲列表:

   Page<Blob> blobs = storage.list(
                bucketName,
                Storage.BlobListOption.prefix(bucketLocation),
                Storage.BlobListOption.currentDirectory()
        );

然后我遍歷 blob 並解析每個與我要查找的文件類型 (XML) 匹配的對象。 在我的 parseXML 方法中,我這樣做:

 byte[] fileByteContent = blob.getContent();
 String blobContent = new String(fileByteContent, StandardCharsets.UTF_8);
 JSONObject json = XML.toJSONObject(blobContent);

但是我的 JSONObject 將顯示特殊字符的廢話,例如這個字段是希伯來語:

Source:
עם פרסום דוחות רווח
Output:
×¢× ×¤×¨×¡×•× ×“×•×—×•×ª ר

我錯過了什么? 我在字符串解析中添加了 UTF_8 Charset 定義,是否需要在其他地方考慮?

您閱讀的信息似乎部分丟失(損壞)。 我試圖恢復它,我得到的最好的是:

×¢× ×¤×¨×¡×•× ×“×•×—×•×ª ר // your data
×ע× ×פ×ר×ס×•× ×“×•×—×•×ת ×ר  // my attempt at extraction

與您在希伯來語中的預期相比:

עם פרסום דוחות רווח 

你可以看到希伯來語中的一些字母被恢復到正確的位置。 但是有些丟失了,或者至少我看不到如何恢復它的邏輯。 我進行檢查的方式是將您的數據轉換為 Unicode 序列,並將希伯來語字符串轉換為 Unicode 序列。 這是我得到的:

×¢× ×¤×¨×¡×•× ×“×•×—×•×ª ר
\u00d7\u00a2\u00d7\u0020\u00d7\u00a4\u00d7\u00a8\u00d7\u00a1\u00d7\u2022\u00d7\u0020\u00d7\u201c\u00d7\u2022\u00d7\u2014\u00d7\u2022\u00d7\u00aa\u0020\u00d7\u00a8
עם פרסום דוחות רווח
\u05e2\u05dd\u0020\u05e4\u05e8\u05e1\u05d5\u05dd\u0020\u05d3\u05d5\u05d7\u05d5\u05ea\u0020\u05e8\u05d5\u05d5\u05d7

我注意到所有用“05e*”編碼的希伯來字母都有對應的代碼“00a*”(例如第一個字母“ע”代碼05e2對應於代碼00a2)。 然而,所有帶有代碼 05d* 的希伯來字母似乎都丟失了。 為了進行轉換,我使用了 class StringUnicodeEncoderDecoder ,它來自我編寫和維護的開源庫 MgntUtils。 如果您想更多地使用它,請使用以下代碼:

        String testStr1 = "×¢× ×¤×¨×¡×•× ×“×•×—×•×ª ר";
//        testStr1 = "¢ ¤¨¡• “•—•ª ¨";
        String encoded1 = StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence(testStr1);
//        encoded1 = encoded1.replaceAll("0a", "5e");
        String restored = StringUnicodeEncoderDecoder.decodeUnicodeSequenceToString(encoded1);
        System.out.println(testStr1 + "\n" + encoded1 + "\n" + restored);
        testStr1 = "עם פרסום דוחות רווח";
        encoded1 = StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence(testStr1);
        restored = StringUnicodeEncoderDecoder.decodeUnicodeSequenceToString(encoded1);
        System.out.println(testStr1 + "\n" + encoded1 + "\n" + restored);

這是StringUnicodeEncoderDecoder 的 Javadoc MgntUtils 庫可以作為Maven 工件或在Github上獲得

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM