Как обрабатывать кодировку символов с помощью XML, JDom, JNI и C++

Я разрабатываю приложение, которое читает XML-документ и передает содержимое с помощью JNI в C++-DLL, которая его проверяет.

Для этой задачи я использую JDom и JUniversalChardet для анализа XML-файла в правильной кодировке. Мой С++ принимает const char* для содержимого XML-файла и нуждается в нем в кодировке «ISO-8895-15», иначе он выдаст исключение из-за искаженных символов.

Мой первый подход состоял в том, чтобы использовать поставляемый OutputFormatter JDom и указать ему использовать Charset.forName("ISO-8859-15") при форматировании документа JDom в строку. После этого часть заголовка XML в этой строке говорит:

<?xml version="1.0" encoding="ISO-8859-15"?>

Проблема в том, что он по-прежнему хранится в строке Java и, следовательно, в UTF-16, если я правильно понял.

Мой собственный метод выглядит примерно так:

public native String jniApiCall(String xmlFileContents);

Поэтому я передаю вышеупомянутую строку из OutputFormatter JDom в этот JNI-метод. По-прежнему все UTF-16, верно?

В методе JNI-C++ я получаю доступ к xmlFileContents String с помощью

const string xmlDataString = env->GetStringUTFChars(xmlFileContents, NULL);

Итак, теперь я получил вышеупомянутую строку в UTF-16 или UTF-8? И мой следующий вопрос: как я могу изменить кодировку символов std::string xmlDataString на ISO-8859-15? Или то, как я это делаю, не совсем элегантно? Или есть способ полностью выполнить кодировку символов в Java?

Спасибо за вашу помощь! Марко


person Community    schedule 30.03.2011    source источник


Ответы (2)


Вы всегда можете преобразовать любой массив String в байтовый массив с необходимой кодировкой символов, используя метод byte[] getBytes(Charset charset) (или даже byte[] getBytes(String charsetName)).

person xappymah    schedule 30.03.2011
comment
Хорошо... И как преобразовать byte[] в std:string без .NET API? - person ; 30.03.2011
comment
Просто конвертируйте byte[] в char*. Как вы сказали выше, необходимый тип - char * в кодировке ISO-8859-15. Итак, вы поняли. - person xappymah; 30.03.2011

В java вы можете использовать myString.getBytes("ISO-8859-15"); чтобы получить массив байтов строки, используя кодировку символов, используемую в качестве параметра (в данном случае ISO-8859-15).

А затем используйте этот массив байтов в C, чтобы получить std::string с чем-то вроде:

std::string myNewstring ( reinterpret_cast< char const* >(myByteArray) )
person pconcepcion    schedule 30.03.2011