В моей программе Java я получаю некоторые данные из xml. Этот xml имеет немного международных символов и кодируется в utf8. Теперь я считал этот xml, использующий xml синтаксический анализатор. После того как я получаю конкретную международную строку из xml синтаксического анализатора, я должен сравнить его с набором предопределенных строк. Проблема состоит в том, когда я использую string.equals на internatinal сбоях сравнения строк.
Как сравнить строки с международными строками в 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
}
Поскольку вы сравниваете строковый литерал, вам необходимо убедиться, что вы сохраняете исходный файл в той же кодировке, что и javac
ожидает. Вы также можете указать, в какой кодировке находятся ваши исходные файлы, с помощью аргумента -encoding
для javac
.
Это похоже на наиболее вероятную ошибку в данном сценарии.
Обратите внимание, что я говорю о кодировке исходного кода Java, а не XML-документа.
Java хранит String
внутри как массив из char
s, которые представляют собой 16-битные значения без знака. Это было основано на более раннем стандарте Unicode, который поддерживал 64 КБ символов.
Ваша строковая константа «Кот-д'Ивуар»
имеет этот формат. Если ваша кодировка символов в вашем XML-документе правильная, тогда Строка
, прочитанная оттуда, также будет в правильном формате. Итак, возможные ошибки:
XML-документ не объявляет кодировку символов;
Объявленная кодировка символов не соответствует фактической используемой кодировке символов.
Возможно, строка XML обрабатывается как US-ASCII вместо UTF-8. Я выводил и то и другое и смотрел на них. Если они выглядят одинаково, сравните их посимвольно, чтобы увидеть, где сравнение не удается. Вы также можете сравнить кодировку UTF8 вашей константы String
с тем, что находится в XML-документе:
byte[] bytes = "Côte d'Ivoire".getBytes("UTF-8");
Это становится более сложным, когда вы начинаете вводить «дополнительные символы». Это символы, превышающие изначально запланированные 64 КБ («кодовые точки» на языке Unicode). См. Дополнительные символы в платформе Java . Это не проблема ни с одним из персонажей, которые вы используете, но это стоит отметить для полноты картины.
Строки Java являются всегда UTF-16. Ваш XML-синтаксический анализатор должен преобразовывать символы UTF-8 файла в UTF-16 во время чтения, а ваши собственные строки уже находятся в UTF-16 в памяти, поэтому вы можете сравнить их с обычным вызовом equals ()
. Если они не сравнивают равных, когда вы думаете, что им следовало бы, проблема, скорее всего, в другом.