在我的java程序中,我正在从xml中检索一些数据。这个xml只有很少的国际字符,用utf8编码。现在我使用xml解析器读取这个xml。一旦我从xml解析器中检索特定的国际字符串,我需要将它与预定义的字符串集进行比较。问题是当我在国际字符串比较中使用string.equals失败时。
如何在java中将字符串与国际字符串进行比较?我正在使用SAXParser& XMLReader从xml读取字符串。
这是比较字符串
的行 String country;
country = getXMLNodeString();
if(country.equals("Côte d'Ivoire"))
{
}
getXMLNodeString()
{
/* Get a SAXParser from the SAXPArserFactory. */
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
/* Get the XMLReader of the SAXParser we created. */
XMLReader xr = sp.getXMLReader();
/* Create a new ContentHandler and apply it to the XML-Reader*/
XmlParser xmlParser = new XmlParser(); //my class to parse xml
xr.setContentHandler(xmlParser);
/* Parse the xml-data from our URL. */
xr.parse(new InputSource(url.openStream()));
/* Parsing has finished. */
//return string here
}
答案 0 :(得分:6)
Java将String
内部存储为char
的数组,这是16位无符号值。这是基于支持64K字符的早期Unicode标准。
您的字符串常量"Côte d'Ivoire"
采用此格式。如果您的XML文档上的字符编码是正确的,那么从那里读取的String
也将采用正确的格式。所以可能的错误是:
XML文档未声明字符编码;
声明的字符编码与使用的实际字符编码不匹配。
也许XML字符串被视为US-ASCII而不是UTF-8。我会输出两个并注视它们。如果它们看起来相同,则逐个字符地比较它们以查看比较失败的位置。您可能还想将常量String
的UTF8编码与XML文档中的内容进行比较:
byte[] bytes = "Côte d'Ivoire".getBytes("UTF-8");
当你开始进入“补充字符”时,它变得更加复杂。这些是超出最初预期64K的字符(Unicode术语中的“代码点”)。见Supplementary Characters in the Java Platform。这不是你正在使用的任何角色的问题,但值得注意的是完整性。
答案 1 :(得分:3)
由于您要与字符串文字进行比较,因此需要确保使用javac
所期望的相同编码保存源文件。您还可以使用-encoding
的{{1}}参数指定源文件的编码。
在这种情况下,这似乎是最有可能的“陷阱”。
请注意,我所说的是Java源代码的编码,而不是XML文档。
答案 2 :(得分:2)
Java字符串始终为UTF-16。您的XML解析器应该在读取时将文件的UTF-8字符转换为UTF-16,并且您自己的字符串在内存中已经是UTF-16,因此您可以将它们与普通的equals()
调用进行比较。如果他们认为不应该比较平等,那么问题可能就是其他问题。
答案 3 :(得分:0)
如果您的XML文件被标记为并且文本文件保存为实际的UTF-8文件,您可以使用contentEquals(literal或string),如下所示:
if (strMyvalue.contentEquals("Côte d'Ivoire") {
// execute
}