Russian Qt Forum
Ноябрь 11, 2024, 06:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Чтение русских букв из реестра?  (Прочитано 9232 раз)
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« : Февраль 02, 2010, 21:43 »

Доброго всем времени суток.

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

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

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

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

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

ArchLinux x86_64 / Win10 64 bit
cya-st
Гость
« Ответ #1 : Февраль 02, 2010, 23:14 »

Вот посмотри примерчик, думаю разберешся:
Код:
QString str1, str2;

QTextCodec *codec = QTextCodec::codecForName("Windows-1251");
str1 = codec->toUnicode(str2);
Записан
cya-st
Гость
« Ответ #2 : Февраль 02, 2010, 23:16 »

str2 -это то что ты прочитал из реестра.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Февраль 02, 2010, 23:16 »

а как читаешь её из реестра?
Записан

Юра.
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #4 : Февраль 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 ,
Цитировать
Вот посмотри примерчик, думаю разберешся:
спасибо, попробую.




Записан

ArchLinux x86_64 / Win10 64 bit
Tonal
Гость
« Ответ #5 : Февраль 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);
 
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #6 : Февраль 03, 2010, 09:06 »

2 Tonal,

спасибо Улыбающийся

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

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

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

Как в этом случае быть?  
« Последнее редактирование: Февраль 03, 2010, 09:09 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
BRE
Гость
« Ответ #7 : Февраль 03, 2010, 09:10 »

т.е codecForName("Windows-1251") в этом случае не проходит по идее.. не буду же я писать для каждой страны определение типа кодировки и вписывать "Windows-125ххххх" ?
QTextCodec * QTextCodec::codecForLocale ()   [static]
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #8 : Февраль 03, 2010, 09:18 »

спс
Записан

ArchLinux x86_64 / Win10 64 bit
Akaiten
Гость
« Ответ #9 : Февраль 03, 2010, 10:13 »

а почему бы не использовать RegQueryValueExW и получать значение в юникоде?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #10 : Февраль 03, 2010, 10:23 »

А там ошибки лезут Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
SASA
Гость
« Ответ #11 : Февраль 03, 2010, 11:17 »

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

На форуме обсуждался вопрос вывода в консоль. И было сказано, что узнать кодировку консоли средствами Qt нельзя. Т.е. из реестра вы считаете, а на консоль вывести может не получится.
Записан
Tonal
Гость
« Ответ #12 : Февраль 04, 2010, 11:29 »

Узнать кодировку консоли вполне можно: GetConsoleCP.
А вот вывести в неё любую unicode строку может и не получится. Улыбающийся

Ну и к тому же это всё жёстко к виндам привязано. Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.142 секунд. Запросов: 23.