我正在使用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
答案 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是否也会受到影响,但如果是,可能会在某处提供补丁。