繁体   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