У меня есть программа для Windows C ++, в которой я хочу вызвать JVM и иметь возможность передать ей параметр, который может быть задан из вызова командной строки программы C ++ (например, параметр командной строки не может быть простым текстом) -Dblah = япония 日本 «). Кажется, что структура JavaVMOption в jni.h определяет строку параметров только как символы, так что, похоже, я не могу просто передать ей широкую строку.
Я попытался преобразовать его в UTF-8 и сохранить в виде узкой строки на стороне C ++, а затем на стороне Java, чтобы преобразовать его обратно, но кажется, что «日本» заменяется фактическим «??» символы, и, таким образом, теряются в процессе преобразования-преобразования.
Я думаю об этом неправильно? Разве это не должно сработать?
Вызов API документация дает понять:
typedef struct JavaVMOption {
char *optionString; /* the option as a string in the default platform encoding */
void *extraInfo;
} JavaVMOption;
Термин «кодировка платформы по умолчанию» является однозначным, что делает не имею ввиду utf-8 на винде. Это означает кодировку, используемую системной кодовой страницей по умолчанию. Если ваш компьютер не настроен на использование японской кодовой страницы (например, 932), то преобразование из строки utf-16 приведет к появлению вопросительных знаков для японских символов, которые невозможно преобразовать. Обычно это не проблема, поскольку у японского пользователя будет выбрана правильная кодовая страница. Нет обходного пути для того, чтобы иметь неправильный.
Убедитесь, что вы выбрали правильную системную кодовую страницу, Панель управления + Регион и Язык для изменения. И используйте WideCharToMultiByte () с CP_ACP, чтобы сделать преобразование.
Других решений пока нет …