簡體   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