微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

导致字符串差异的编码问题

如何解决导致字符串差异的编码问题

我有一个遗留服务,它从数据库返回一个 XML 字符串。现在对于一个特定场景,此服务返回一个字符串,其中包含字符  。我最近将此服务转移到一台新的 Windows 10 机器上,当我将此字符串写入文件时,XML 文件变得无法解析。在新机器上打开旧机器上的文件时,我看到该文件是 UTF-8 编码的,而在我的新机器上,该文件是用 ANSI 编写的。所以我开始用 UTF-8 编写文件。该文件现在可以解析了,并且与旧机器上的文件完全相同。但现在的问题是该服务仍在发送包含字符   的 XML 字符串。但是我已经开始用 UTF-8 编写文件,因此本地文件具有字符 "Â ",服务发送的字符串具有字符 xA0。并且逻辑现在比较这两个字符串并找到差异,而实际上唯一的差异在于这些文件的编码。现在我很确定我要写入文件的编码是 UTF-8,因为两台机器的文件是相同的,但是我如何转换服务发送的字符串,使其采用 UTF-8。这样只有在存在任何实际差异时才能发现差异。这个编码的东西对我来说真的很困惑。请帮助我了解这里实际发生的情况。

这里要注意的另一件事是旧 Windows 7 机器上的 XML 文件显示编码 ANSI,但是当我在新的 Windows 10 机器上复制该文件时,编码显示为 UTF-8。我使用记事本检查编码(我打开保存对话框)。有人可以帮助我了解 Windows 7 上存在某种问题,该问题已在 Windows 10 中修复,这是同一文件的两台机器之间编码差异背后的原因。

我已经就此询问了 question。我回答了我自己的问题,因为我确实通过以 UTF-8 编码编写文件解决了解析问题。

我已经尝试使用以下:

byte[] bytes = retVal.getBytes(StandardCharsets.UTF_8);
retVal = new String(bytes,StandardCharsets.UTF_8);

retVal 是服务发送的字符串。比较retVal和写入文件的字符串,还是有区别的。

这是我用来从服务中获取字符串代码

        req()
        {
        HttpClient client = new HttpClient() {};
        client.getParams().setParameter("http.useragent","Service");

            String url = "url";
    
            // Generate Request Body
            String reqBody = generateRequestBody(prarams);
            // Set Appropriate Locale
            PostMethod method = new PostMethod(url);
            method.setRequestBody(reqBody);
    
            String retVal = "";
            // Execute the HTTP Call
            int returnCode = client.executeMethod(method);
    
            if (returnCode == HttpStatus.SC_OK) {
                // Convert response to XML
                DOMParser parser = new DOMParser();
                parser.parse(new InputSource(method.getResponseBodyAsstream()));
                Document doc = parser.getDocument();
                doc.setXmlStandalone(true);
                NodeList nList = doc.getElementsByTagName("tag1");
                Node node = nList.item(0);
    
                // Convert request to String and return
                retVal = nodetoString(node);
    
            }
            return retVal;
          }

    private String nodetoString(Node node){
    StringWriter sw = new StringWriter();

    try {
        Transformer t = TransformerFactory.newInstance().newTransformer();
        t.setoutputProperty(OutputKeys.OMIT_XML_DECLaraTION,"no");
        t.transform(new DOMSource(node),new StreamResult(sw));


    } catch (TransformerException te) {
        LOG.info(getStacktraceFromException(te));
        LOG.error("Exception during String to XML transformation ",te);
    }
    return sw.toString();
}

所以我试图在源代码上修复编码,但不幸的是这也不起作用。这是我的新 nodetoString 方法

    private String nodetoString(Node node){
        StringWriter sw = new StringWriter();
        String strRepeatString = "";
        try {
            Transformer t = TransformerFactory.newInstance().newTransformer();
            t.setoutputProperty(OutputKeys.OMIT_XML_DECLaraTION,"no");
            t.setoutputProperty(OutputKeys.ENCODING,"UTF-8");
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            StreamResult sr = new StreamResult(new OutputStreamWriter(bos,"UTF-8"));

            t.transform(new DOMSource(node),sr);
            byte[] outputBytes = bos.toByteArray();
            strRepeatString = new String(outputBytes,"UTF-8");

        } catch (TransformerException te) {
            LOG.info(getStacktraceFromException(te));
            LOG.error("Exception during String to XML transformation ",te);
        } catch (UnsupportedEncodingException ex) {
            LOG.info("Error");
        }
          return strRepeatString;
    }

在比较 strRepeatString 和使用 UTF-8 编码保存的本地文件代码可以在 question 的答案中找到)时,我仍然得到了字符的差异。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。