Чтение строки юникода из реестра - PullRequest
1 голос
/ 22 декабря 2009

Я использую Codegear C ++ Builder 2007. Я пытаюсь прочитать строковое значение с путем из реестра. Этот путь может содержать символы Юникода, например русский.

Я добавил строковое значение с помощью regedit и проверил, экспортировав, что значение действительно содержит ожидаемые символы Юникода. Результат в S1, S2 и S3 ниже всех содержит «?» (0x3F) вместо символов Юникода. Что мне не хватает?

TRegistry *Registry = new TRegistry;  
try  
{  
  Registry->RootKey = HKEY_CURRENT_USER;  
  if (Registry->OpenKey ("Software\\qwe\\asd", false))  
    {  
        AnsiString S1 = Registry->ReadString ("zxc");  
        WideString S2 = Registry->ReadString ("zxc");  
        UTF8String S3 = Registry->ReadString ("zxc");  
    }  
}  
__finally  
{  
    delete Registry;  
}

/ Бьорн

Ответы [ 2 ]

3 голосов
/ 05 января 2010

VCL в C ++ Builder (и Delphi) 2007 использует Ansi, а не Unicode. TRegistry :: ReadString () внутренне вызывает функцию RegQueryValueExA () API Win32 вместо RegQueryValueExW (), а TRegistry :: ReadString () возвращает AnsiString, которая использует кодовую страницу Ansi по умолчанию для ОС. Любые данные Unicode автоматически конвертируются в Ansi операционной системой еще до того, как ваш код их увидит. '?' символ означает, что символ Unicode был преобразован в кодовую страницу Ansi, которая не поддерживает этот символ. Неважно, какой тип строки вы присваиваете результат ReadString (), данные Unicode уже потеряны до того, как ReadString () даже завершится.

Если вам нужно читать данные Unicode как Unicode, то вам нужно напрямую вызывать RegQueryValueExW () вместо использования TRegistry :: ReadString () (или обновления до C ++ Builder 2009 или более поздней версии, которая теперь использует Unicode).

0 голосов
/ 22 декабря 2009

http://do -the-right-things.blogspot.com / 2008/03 / CodeGear-Дельфы-2006nets-tregistry.html

CodeGear Delphi 2006. Сбой TRegistry в Framework 2 SP1

Я не знаю, затрагивается ли C ++ 2007, но если это так, возможно, где-то есть патч.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...