比较java中的utf-8字符串

cpp*_*dev 5 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
  }
Run Code Online (Sandbox Code Playgroud)

cle*_*tus 6

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

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

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

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

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

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

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


Joh*_*ess 3

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

这似乎是这种情况下最有可能的“陷阱”。

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