繁体   English   中英

比较java中的utf-8字符串

[英]Comparing utf-8 strings in java

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

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

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

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

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

也许XML字符串被视为US-ASCII而不是UTF-8。 我会输出两个并注视它们。 如果它们看起来相同,则逐个字符地比较它们以查看比较失败的位置。 您可能还希望将常量String的UTF8编码与XML文档中的内容进行比较:

byte[] bytes = "Côte d'Ivoire".getBytes("UTF-8");

当你开始进入“补充字符”时,它会变得更加复杂。 这些是超出最初预期64K的字符(Unicode术语中的“代码点”)。 请参阅Java平台中的补充字符 这不是您正在使用的任何角色的问题,但值得注意的是完整性。

由于您要与字符串文字进行比较,因此需要确保将源文件保存为javac所期望的相同编码。 您还可以使用javac-encoding参数指定源文件的-encoding

在这种情况下,这似乎是最有可能“陷入困境”。

请注意,我在谈论Java源代码的编码,而不是XML文档。

Java字符串始终为UTF-16。 您的XML解析器应该在读取时将文件的UTF-8字符转换为UTF-16,并且您自己的字符串在内存中已经是UTF-16,因此您可以将它们与普通的equals()调用进行比较。 如果他们认为不应该比较平等,那么问题可能就是其他问题。

如果您的XML文件被标记为并且文本文件保存为实际的UTF-8文件,您可以使用contentEquals(literal或string),如下所示:

if (strMyvalue.contentEquals("Côte d'Ivoire") {
    // execute
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM