“如何防止Java更改”&&引用;至&;amp&引用;在XML文件中

“如何防止Java更改”&&引用;至&;amp&引用;在XML文件中,java,xml,string,unicode,non-ascii-characters,Java,Xml,String,Unicode,Non Ascii Characters,我需要使用Java构建一个XML文件。问题是我必须使用一些特殊字符,比如“ć”,然后在我的移动应用程序中读取它 如果我手动将ć更改为和#263。但当我尝试使用java进行此操作时,例如使用: result = result.replaceAll("ć", "ć"); 我得到了类似于ć这会导致在我的客户端应用程序中显示错误 我如何用和#263替换ć没有任何解析?Java XML API负责根据文件的输出编码需要转义字符,因此您不应该从代码中执行任何“特殊字符”的

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

如果我手动将
ć
更改为
和#263。但当我尝试使用java进行此操作时,例如使用:

result = result.replaceAll("ć", "ć");
我得到了类似于
ć这会导致在我的客户端应用程序中显示错误


我如何用
和#263替换
ć
没有任何解析?

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

我想我理解您的意图。我不知道是否有一种方法可以不用解析就完成你正在做的事情。因为&是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 ]]>
    }

}
import org.junit.Test;
公营舱位{
@试验
公共空解析(){
最后一个字符串myString=“ćabc123ć”;
System.out.println(myString.replaceAll(“ć”)、“ć;”);
//然后用
}
}

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

正确的做法是将
ć
保留在原来的位置,让序列化程序将其写入适当的编码,最好是UTF-8,因为这是XML文件的默认编码,也是唯一合理的编码。注意:不要相信记事本中的输出。记事本是一个毫无希望的编辑器,它默认使用无用的特定于语言环境的编码。使用更好的编辑器,如记事本+,它将向您显示文件显示所使用的编码,并允许您更改文件

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


如果您无法修复它们,并且现在必须解决它,最好的方法是告诉您的XML序列化程序写入ASCII编码,而不是UTF-8。由于ASCII不能直接容纳像
ć
这样的字符,因此序列化程序将编码为
和#263以进行补偿。如何设置编码取决于用于生成XML的内容;例如,对于
转换器
您可以
设置OutputProperty(OutputKeys.ENCODING,“US-ASCII”)

我不确定是否需要显式转义。Java的XML API应该隐式地做到这一点。无论如何,这是否接近于回答你的问题?如果
&#263;会导致错误的显示,错误在客户端应用程序,如果
ć
需要转义,则应予以修复,java XML api会隐式执行此操作,无需任何其他操作。但当我不执行任何操作时,最终XML中只会出现“ć”,这会导致显示奇怪的字符,例如“Ä”在我的应用程序上。这可能是读取XML的应用程序中的问题,而不是编写XML的应用程序中的问题……我不知道,但我知道,当我在记事本中手动将“ć”更改为“263”时,它可以正常工作。我只是希望Java不要为我做任何事情:)@michalsol:Farrandu是正确的。Java正在正确地完成它的工作。问题出在读取XML的应用程序中,而不是在创建XML的应用程序中
ć
在UTF-8(XML的默认字符集)中编码为
0xC4 0x87
。当解释为ISO-8859-1时,0xC4是
Ä
(0x87是
)。读取应用程序忽略XML的真实编码,并使用错误的字符集解释XML的原始字节。您需要修复阅读应用程序中的错误。XML本身没有问题,它的编码是正确的。