2011-03-30 85 views
0

我正在開發一個應用程序,它讀取XML文檔並將內容與JNI一起傳遞給驗證它的C++ - DLL。如何使用XML,JDom,JNI和C++處理字符編碼

對於此任務,我使用JDomJUniversalChardet以正確的編碼解析XML文件。我的C++接受const char*作爲XML文件的內容,並且需要使用編碼「ISO-8895-15」,否則它會因畸形字符引發異常。

我的第一種方法是使用JDom的OutputFormatter,並告訴它在使用JDom文檔格式化爲String時使用Charset.forName("ISO-8859-15")。之後,此字符串中的XML的頭部分說:

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

的問題是,它仍然存儲在Java String,並因此UTF-16,如果我說對了。

我的本地方法看起來是這樣的:

public native String jniApiCall(String xmlFileContents); 

所以我通過上述字符串從JDOM的OutputFormatter到這個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中完成字符編碼?

感謝您的幫助! Marco

回答

1

您可以隨時使用byte[] getBytes(Charset charset)方法(或甚至byte[] getBytes(String charsetName))將任何String轉換爲所需字符編碼的字節數組。

+0

好吧......而如何轉換我的字節[]到STD:字符串沒有.NET API? – 2011-03-30 15:33:44

+0

只需將'byte []'轉換爲'char *'即可。如上所述,所需的類型是ISO-8859-15編碼中的char *'。所以,你明白了。 – xappymah 2011-03-30 15:45:09

1

在java中,你也許可以使用myString.getBytes("ISO-8859-15");使用用作參數的字符編碼(在本例中爲ISO-8859-15)獲取字符串的字節數組

,然後使用該字節數組中C的東西,如獲得std::string

std::string myNewstring (reinterpret_cast< char const* >(myByteArray))