【问题标题】:How to prevent Java from changing "&" to "&" in XML file如何防止Java在XML文件中将“&”更改为“&”
【发布时间】:2015-12-06 21:01:20
【问题描述】:

我需要使用 Java 构建一个 XML 文件。问题是我必须使用一些特殊字符,例如“ć”,然后在我的移动应用程序中阅读。

如果我在 XML 文件中的记事本中手动将 <tag>ć</tag> 更改为 <tag>ć</tag>,它工作正常。但是当我尝试在 java 中执行此操作时,例如使用:

result = result.replaceAll("ć", "ć");

我收到类似<tag>ć</tag>的信息,这会导致我的客户端应用程序显示错误。

如何在不进行任何解析的情况下将ć 替换为ć

【问题讨论】:

  • 我不确定您是否需要明确转义。 Java 的 XML API 应该隐式地做到这一点。无论如何,这个 SO question 接近回答你的问题了吗?
  • 如果XML文件中的<tag>ć</tag>导致显示错误,故障出在客户端应用程序上,应该在那里修复
  • 如果ć 需要转义,java xml api 会隐式执行,不需要任何替代 todo。

标签: java xml string unicode non-ascii-characters


【解决方案1】:

我想我明白你想要做什么。我不知道是否有办法在不解析的情况下做你正在做的事情。因为 & 是 XML 中的特殊字符,所以您必须对其进行转义或将元素的内容包装在 CDATA 块中,这样 XML 解析器就不会对其进行解析。

import org.junit.Test;

public class AsciiTesting {

    @Test
    public void parse() {
        final String myString = "ćabc123ć";
        System.out.println(myString.replaceAll("ć", "ć"));
        // Then wrap the <tag> content with <![CDATA[ put your replaced string here ]]>
    }

}

【讨论】:

    【解决方案2】:

    Java XML API 会根据文件输出编码的需要处理转义字符,因此您不应从代码中执行任何“特殊字符”替换。

    【讨论】:

    • 但是当我什么都不做时,我在最终的 XML 中只得到“ć”,这导致显示奇怪的字符,例如。 “Ä”在我的应用程序上。
    • 这可能是读取 XML 的应用程序的问题,而不是编写它的应用程序......
    • 我不知道,但我知道,当我在记事本中手动将 'ć' 更改为 'ć' 时,它工作正常。我只是希望 Java 不为我做任何事情 :)
    • @michalsol:Farrandu 是正确的。 Java 正在正确地完成它的工作。问题出在读取 XML 的应用程序中,而不是在创建 XML 的应用程序中。 ć 在 UTF-8(XML 的默认字符集)中编码为 0xC4 0x87。当解释为 ISO-8859-1 时,0xC4 是 Ä(而 0x87 是 )。读取应用程序忽略了 XML 的真实编码,并使用错误的字符集解释了 XML 的原始字节。您需要修复阅读应用程序中的 THAT 错误。 XML 本身没有问题,它被正确编码。
    【解决方案3】:

    在使用 XML 序列化程序时,您不会接触到原始标记。 XML 工具的全部目的是让您可以编写纯文本内容,而不必担心使用正确的转义形式。

    正确的做法是将ć 留在原处,让序列化程序将其写入适当的编码,希望是UTF-8,因为这是XML 文件的默认且唯一合理的编码。注意:不要相信记事本中的输出。记事本是一个无用的编辑器,它默认使用无用的特定于语言环境的编码。使用更好的编辑器,例如 Notepad++,它会告诉你它使用什么编码来显示文件并让你改变它。

    如果您在文件中看到 ć 并且编辑器告诉您它以 UTF-8 格式读取文件,但移动应用程序仍然无法正确读取它,那么这些应用程序已损坏,应该修复。

    如果您无法修复它们并且必须暂时解决它,最好的办法是告诉您的 XML 序列化器写入 ASCII 编码而不是 UTF-8。由于ASCII不能直接容纳ć这样的字符,所以序列化器会编码成&amp;#263;来弥补。设置编码的方式取决于生成 XML 的方式;例如,对于 Transformer,您可以使用 setOutputProperty(OutputKeys.ENCODING, "US-ASCII");

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-02
      • 2021-10-23
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 2011-01-01
      相关资源
      最近更新 更多