从注册表中读取unicode字符串

时间:2009-12-22 11:11:13

标签: unicode registry c++builder

我正在使用codegear c ++ builder 2007.我正在尝试使用注册表中的路径读取字符串值。此路径可以包含unicode字符,例如俄语。

我已经使用regedit添加了一个字符串值,并通过导出验证该值确实包含预期的unicode字符。下面S1,S2和S3的结果都包含'?' (0x3F)而不是unicode字符。我错过了什么?

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;  
}

/的Björn

2 个答案:

答案 0 :(得分:3)

C ++ Builder(和Delphi)2007中的VCL使用Ansi,而不是Unicode。 TRegistry :: ReadString()在内部调用Win32 API RegQueryValueExA()函数而不是RegQueryValueExW(),TRegistry :: ReadString()返回一个使用操作系统默认Ansi代码页的AnsiString。在您的代码看到之前,操作系统会自动将任何Unicode数据转换为Ansi。 '?' character表示Unicode字符已转换为不支持该字符的Ansi代码页。将ReadString()的结果赋给哪种字符串类型并不重要,在ReadString()甚至退出之前,Unicode数据已经丢失。

如果需要将Unicode数据读取为Unicode,则需要直接调用RegQueryValueExW()而不是使用TRegistry :: ReadString()(或升级到C ++ Builder 2009或更高版本,现在使用Unicode)。 / p>

答案 1 :(得分:0)

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

CodeGear Delphi 2006.Net的TRegistry在Framework 2 SP1中失败

我不知道C ++ 2007是否也会受到影响,但如果是,可能会在某处提供补丁。