我有一个Windows C ++程序,我想调用一个JVM,并且能够传递一个可能从C ++程序的命令行调用中给出的选项(命令行选项可能不是普通的)文本,例如" -Dblah = japan日本")。 jni.h中的JavaVMOption结构似乎只将选项字符串定义为chars,所以看起来我不能只传递一个宽字符串。
我尝试将其转换为UTF-8并将其作为一个窄字符串存储在C ++端,然后在Java端将其转换回来,但它似乎是"日本"被实际的" ??"取代字符,因此在转换 - 非转换过程中丢失。
我是否错误地想到了这个?这不会被期望起作用吗?
答案 0 :(得分: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字符串的转换将为无法转换的日语字符生成问号。这通常不是问题,因为日语用户将选择正确的代码页。没有解决错误的方法。
确保您已选择正确的系统代码页,要更改控制面板+区域和语言。并使用带有CP_ACP的WideCharToMultiByte()进行转换。