Russian Qt Forum

Qt => Интернационализация, локализация => Тема начата: kuzulis от Февраль 02, 2010, 21:43



Название: Чтение русских букв из реестра?
Отправлено: kuzulis от Февраль 02, 2010, 21:43
Доброго всем времени суток.

Не получается что-то отобразить в консоли считанную строку значения из реестра. Строка в реестре написана "по русски".
Читал виндовой АПИ-шной функцией RegQueryValueExA.

код
Код:
...
qDebug() << "friendlyName = " << str.toLatin1();
...

где str - считанная из реестра строка приведенная к типу QString

Должно получиться "Последовательный порт (COM1)", но программка выводит это:
Цитировать
friendlyName =  "Iineaaiaaoaeuiue ii?o (COM1)"

Подскажите, как "орусифицировать" ?


Название: Re: Чтение русских букв из реестра?
Отправлено: cya-st от Февраль 02, 2010, 23:14
Вот посмотри примерчик, думаю разберешся:
Код:
QString str1, str2;

QTextCodec *codec = QTextCodec::codecForName("Windows-1251");
str1 = codec->toUnicode(str2);


Название: Re: Чтение русских букв из реестра?
Отправлено: cya-st от Февраль 02, 2010, 23:16
str2 -это то что ты прочитал из реестра.


Название: Re: Чтение русских букв из реестра?
Отправлено: lit-uriy от Февраль 02, 2010, 23:16
а как читаешь её из реестра?


Название: Re: Чтение русских букв из реестра?
Отправлено: kuzulis от Февраль 03, 2010, 08:23
2 lit-uriy ,
Цитировать
а как читаешь её из реестра?
что-то вроде:
Код:
...
    HKEY hKey = 0;
    char fname[256] = {0};
    DWORD cData = sizeof(fname);
...
...
    LONG ret = RegQueryValueExA(hKey,"FriendlyName",0,0,(LPBYTE)fname,&cData);
...
...
    return QString(fname);

как-то так.. пишу по памяти.

Если искомая строка (значение ключа) в реестре английское - то проблем нет.. но если кирилица, то не получается.

2 cya-st ,
Цитировать
Вот посмотри примерчик, думаю разберешся:
спасибо, попробую.






Название: Re: Чтение русских букв из реестра?
Отправлено: Tonal от Февраль 03, 2010, 08:53
Ты вызываешь RegQueryValueExA - это Ansi-шная функция. Т. е. строки она принимает/возвращает в ANSI.
Для русских это кодировке windows-1251.
Т. е. при преобразовании в QString, которая в unicode тебе нужно строку конвертнуть как показал cya-st
Код
C++ (Qt)
QTextCodec *codec = QTextCodec::codecForName("Windows-1251");
return codec->toUnicode(fname);
 
А вот на консоль по умолчанию работает в кодировке OEM - cp866.
Т. е. перед выводом строки её нужно конвертнуть в OEM:
Код
C++ (Qt)
QTextCodec *codec = QTextCodec::codecForName("cp866");
qDebug() << "friendlyName = " << codec->fromUnicode(str);
 


Название: Re: Чтение русских букв из реестра?
Отправлено: kuzulis от Февраль 03, 2010, 09:06
2 Tonal,

спасибо :)

Но если я хочу сделать "универсальный" вывод строки, т.е. чтобы правильно отображалось название в любом Windows!!!

т.е. взял к примеру грек или араб или китаец запустил программку в своей локализованной винде и у него строка отобразилась бы без крякозябл !

т.е codecForName("Windows-1251") в этом случае не проходит по идее.. не буду же я писать для каждой страны определение типа кодировки и вписывать "Windows-125ххххх" ?

Как в этом случае быть?  


Название: Re: Чтение русских букв из реестра?
Отправлено: BRE от Февраль 03, 2010, 09:10
т.е codecForName("Windows-1251") в этом случае не проходит по идее.. не буду же я писать для каждой страны определение типа кодировки и вписывать "Windows-125ххххх" ?
QTextCodec * QTextCodec::codecForLocale ()   [static]


Название: Re: Чтение русских букв из реестра?
Отправлено: kuzulis от Февраль 03, 2010, 09:18
спс


Название: Re: Чтение русских букв из реестра?
Отправлено: Akaiten от Февраль 03, 2010, 10:13
а почему бы не использовать RegQueryValueExW и получать значение в юникоде?


Название: Re: Чтение русских букв из реестра?
Отправлено: kuzulis от Февраль 03, 2010, 10:23
А там ошибки лезут :)


Название: Re: Чтение русских букв из реестра?
Отправлено: SASA от Февраль 03, 2010, 11:17
Как в этом случае быть?  

На форуме обсуждался вопрос вывода в консоль. И было сказано, что узнать кодировку консоли средствами Qt нельзя. Т.е. из реестра вы считаете, а на консоль вывести может не получится.


Название: Re: Чтение русских букв из реестра?
Отправлено: Tonal от Февраль 04, 2010, 11:29
Узнать кодировку консоли вполне можно: GetConsoleCP (http://msdn.microsoft.com/en-us/library/ms683162%28VS.85%29.aspx).
А вот вывести в неё любую unicode строку может и не получится. :)

Ну и к тому же это всё жёстко к виндам привязано. :)