从注册表读取unicode字符串 在C++ +Builder(和Delphi)2007中的VCL使用ANSI,而不是Unicode。TRegistry::ReadString()在内部调用Win32 API RegQueryValueExA()函数而不是RegQueryValueExW(),TRegistry::ReadString()返回使用操作系统默认Ansi代码页的AnsiString。在代码看到任何Unicode数据之前,操作系统会自动将其转换为Ansi。“?”字符表示Unicode字符已转换为不支持该字符的Ansi代码页。无论您将ReadString()的结果分配给哪种字符串类型,在ReadString()退出之前,Unicode数据已经丢失
我用regedit添加了一个字符串值,并通过导出验证该值是否确实包含预期的unicode字符。下面S1、S2和S3中的结果都包含“?”(0x3F)而不是unicode字符。我错过了什么从注册表读取unicode字符串 在C++ +Builder(和Delphi)2007中的VCL使用ANSI,而不是Unicode。TRegistry::ReadString()在内部调用Win32 API RegQueryValueExA()函数而不是RegQueryValueExW(),TRegistry::ReadString()返回使用操作系统默认Ansi代码页的AnsiString。在代码看到任何Unicode数据之前,操作系统会自动将其转换为Ansi。“?”字符表示Unicode字符已转换为不支持该字符的Ansi代码页。无论您将ReadString()的结果分配给哪种字符串类型,在ReadString()退出之前,Unicode数据已经丢失,unicode,registry,c++builder,Unicode,Registry,C++builder,我用regedit添加了一个字符串值,并通过导出验证该值是否确实包含预期的unicode字符。下面S1、S2和S3中的结果都包含“?”(0x3F)而不是unicode字符。我错过了什么 TRegistry *Registry = new TRegistry; try { Registry->RootKey = HKEY_CURRENT_USER; if (Registry->OpenKey ("Software\\qwe\\asd", false))
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;
}
/比约恩
CodeGear Delphi 2006.Net的TRegistry在Framework 2 SP1中失败
我不知道C++ 2007是否也受到影响,但是如果是,可能有补丁在某处可用。
CodeGear Delphi 2006.Net的TRegistry在Framework 2 SP1中失败
我不知道C++ 2007是否也受到影响,但是如果是,可能有补丁可用。
< p>在C++ +Builder(和Delphi)2007中的VCL使用ANSI,而不是Unicode。TRegistry::ReadString()在内部调用Win32 API RegQueryValueExA()函数而不是RegQueryValueExW(),TRegistry::ReadString()返回使用操作系统默认Ansi代码页的AnsiString。在代码看到任何Unicode数据之前,操作系统会自动将其转换为Ansi。“?”字符表示Unicode字符已转换为不支持该字符的Ansi代码页。无论您将ReadString()的结果分配给哪种字符串类型,在ReadString()退出之前,Unicode数据已经丢失 如果需要以Unicode格式读取Unicode数据,则需要直接调用regQueryValueXw(),而不是使用TRegistry::ReadString()(或者升级到C++Builder 2009或更高版本,现在使用Unicode)。C++Builder(和Delphi)2007中的VCL使用Ansi,而不是Unicode。TRegistry::ReadString()在内部调用Win32 API RegQueryValueExA()函数而不是RegQueryValueExW(),TRegistry::ReadString()返回使用操作系统默认Ansi代码页的AnsiString。在代码看到任何Unicode数据之前,操作系统会自动将其转换为Ansi。“?”字符表示Unicode字符已转换为不支持该字符的Ansi代码页。无论您将ReadString()的结果分配给哪种字符串类型,在ReadString()退出之前,Unicode数据已经丢失如果需要以Unicode格式读取Unicode数据,则需要直接调用regQueryValueXw(),而不是使用TRegistry::ReadString()(或者升级到C++Builder 2009或更高版本,现在使用Unicode)。不幸的是,这不是问题所在。返回字符串的长度是正确的,但每个unicode字符都替换为问号(ascii 0x3F)。不幸的是,这不是问题所在。返回字符串的长度正确,但每个unicode字符都替换为问号(ascii 0x3F)。