从注册表读取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字符串 在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))

我用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;  
}
/比约恩

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)。