2012-11-19 27 views
1

我有一個Windows C++程序,我想調用一個JVM並且能夠傳遞一個選項,可以從C++程序的命令行調用中給出一個選項(命令行選項可能不是純文本,例如「-Dblah =日本日本」)。 jni.h中的JavaVMOption結構似乎只將選項字符串定義爲字符,所以看起來我不能將它傳遞給一個寬字符串。可能將UTF-8/UTF-16選項傳遞給從C++調用的JVM?

我試圖將其轉換爲UTF-8並將其存儲爲C++端的窄字符串,然後在Java端將其轉換回來,但似乎將「日本」替換爲實際的「??」字符,並因此在轉換不轉換過程中丟失。

我在想這個不對嗎?這會不會預計會奏效?

+1

您可能會發現這封郵件很有趣:http://mail.openjdk.java.net/pipermail/jdk8-dev/2011-July/000058.html – kol

+0

@kol:是的,非常有趣 - 謝謝。這將是一個非常受歡迎的改進。 – likso

回答

1

調用api documentation清楚:

typedef struct JavaVMOption { 
    char *optionString; /* the option as a string in the default platform encoding */ 
    void *extraInfo; 
} JavaVMOption; 

術語 「默認平臺編碼」 是明確的,那不意味着在Windows UTF-8。它表示默認系統代碼頁使用的編碼。如果您的機器未配置爲使用日文代碼頁(如932),則來自utf-16字符串的轉換將爲日文字符生成問號,而日文字符不能轉換。這通常不是問題,因爲日本用戶將選擇正確的代碼頁。沒有解決方法,因爲有錯誤的。

確保您已選擇正確的系統代碼頁,控制面板+區域和語言更改。並使用WideCharToMultiByte()和CP_ACP進行轉換。

+0

恕我直言,CP936應該是簡體中文(GBK)的代碼頁,而不是日文。對於日語(Shift-JIS),代碼頁是CP932。 – ZhangChn

+0

@Hans:謝謝你讓我挺直。我希望太多。 – likso