2009-12-22 4 views
1

Я использую codegear C++ builder 2007. Я пытаюсь прочитать строковое значение с помощью пути из реестра. Этот путь может содержать символы юникода, например, русский.Чтение строки unicode из реестра

Я добавил строковое значение с 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; 
} 

/Бьорн

ответ

0

http://do-the-right-things.blogspot.com/2008/03/codegear-delphi-2006nets-tregistry.html

TRegistry CodeGear Delphi 2006.Net терпит неудачу в Framework 2 SP1

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

+0

К сожалению, это не проблема. Длина возвращаемой строки верна, но каждый символ юникода заменяется вопросительным знаком (ascii 0x3F). – 2009-12-22 12:05:02

2

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

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

Смежные вопросы