Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > jni Русские символы


Автор: IUMag 7.8.2015, 12:08
Добрый день, работаю с библиотекой jacob, которая написана с помощью jni. Там есть исходники с++. Как мне можно передать русскую строку. Вот кусок кода:
Код

const char *progid = env->GetStringUTFChars(_progid, 0);
CLSID clsid;
HRESULT hr;
IUnknown *punk = NULL;
IDispatch *pIDispatch;
USES_CONVERSION;
LPOLESTR bsProgId = A2W(progid);
if (strchr(progid,':')) 
{
 env->ReleaseStringUTFChars(_progid, progid);
 // it's a moniker
 hr = CoGetObject(bsProgId, NULL, IID_IUnknown, (LPVOID *)&punk);

Прочитал что функция GetStringUTFChars не работает с русскими символами, как мне быть?
Если я использую эту функцию, то он мне возвращает такую строку WinNT://IUMAG/Администратор,user

Автор: LSD 7.8.2015, 12:30
Не знаю, где ты это прочитал, но читай там больше. В https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html ясно сказано:
Цитата
GetStringUTFChars
const char * GetStringUTFChars(JNIEnv *env, jstring string, jboolean *isCopy);

Returns a pointer to an array of bytes representing the string in modified UTF-8 encoding. This array is valid until it is released by ReleaseStringUTFChars().

If isCopy is not NULL, then *isCopy is set to JNI_TRUE if a copy is made; or it is set to JNI_FALSE if no copy is made.

Т.е. ты получишь UTF-8 строку, никаких проблем с поддержкой русских символов в UTF-8 - нет.

Добавлено через 2 минуты и 12 секунд
Цитата(IUMag @  7.8.2015,  13:08 Найти цитируемый пост)
Если я использую эту функцию, то он мне возвращает такую строку WinNT://IUMAG/Администратор,user 

Это строка в UTF-8, в UTF-8 русские символы занимают 2 байта. Я не знаю что ты дальше планируешь делать с этой строкой, но возможно ее надо из UTF-8 преобразовать в Windows-1251.

Автор: IUMag 7.8.2015, 13:09
Код

String objUser2 = new String(objUser.getBytes("utf-8"),"cp1251");

Вот пробовал

Добавлено через 12 минут и 22 секунды
Сейчас проверил, у меня символы пропадают тут LPOLESTR bsProgId = A2W(progid);

Автор: LSD 7.8.2015, 16:49
Цитата(IUMag @  7.8.2015,  14:09 Найти цитируемый пост)
Вот пробовал

НИКОГДА так не делай.



Я еще раз повторю:
Цитата(LSD @  7.8.2015,  13:30 Найти цитируемый пост)
Это строка в UTF-8

которая интерпретируется как ASCII, если ее просмотреть как UTF-8 то будет WinNT://IUMAG/Администратор,user. Из Java все приходит правильно и в Java ничего делать не надо, проблема в C. Что A2W ждет на вход?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)