比较java中的utf-8字符串

时间:2010-05-08 02:56:12

标签: java unicode

在我的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
  }

4 个答案:

答案 0 :(得分:6)

Java将String内部存储为char的数组,这是16位无符号值。这是基于支持64K字符的早期Unicode标准。

您的字符串常量"Côte d'Ivoire"采用此格式。如果您的XML文档上的字符编码是正确的,那么从那里读取的String也将采用正确的格式。所以可能的错误是:

  1. XML文档未声明字符编码;

  2. 声明的字符编码与使用的实际字符编码不匹配。

  3. 也许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
}