UnicodeString兼容性问题

时间:2014-01-22 10:25:50

标签: c++ unicode c++builder vcl

我正在将一个较旧的项目从C ++ Builder 2009移植到XE5。在旧项目中,Unicode字符串的编译器选项设置为“_TCHAR映射到:char”。这在旧项目中运作良好。

移植时,我在XE5中设置了相同的编译器选项。但是我仍然会遇到像这样的代码的编译器错误:

std::string str = String(some_component.Text).t_str();

这会出现以下错误:

  

[bcc32警告] file.cpp(89):W8111访问已弃用   entity'UnicodeString :: t_str()const'

     

[bcc32错误] file.cpp(89):E2285无法找到匹配项   'operator string :: =(wchar_t *)'

显然XE5已经决定String::t_str()应该给我一个wchar_t*而不是char*,即使我已经设置了如上所述的编译器选项。

我该如何解决这个问题?

我很清楚C ++ Builder已采取内部使用Unicode的步骤(即使在2009版本中),但这是一个200k LOC的旧项目。将其更新为Unicode将是一项非常低优先级的陡峭任务。

修改

我可以通过将代码更改为

来使其工作
std::string str = AnsiString(some_component.Text).c_str();

但这意味着我必须在很多地方更改代码。有没有更好的方法不涉及重写代码?

1 个答案:

答案 0 :(得分:8)

在CB2009中首次引入UnicodeString::t_str()时,它返回char*wchar_t*,具体取决于TCHAR映射到的内容。为了返回char*,它改变了UnicodeString的内部数据以使其成为Ansi(因此打破了UnicodeString是Unicode字符串的合同)。 这是临时的用于迁移目的,而人们仍在重写代码以支持Unicode。这种破坏是可以接受的,因为RTL具有处理Ansi编码的UnicodeString(和Unicode编码的AnsiString)值的特殊逻辑。但是,这是危险的代码。在几个版本之后,当人们有足够的时间迁移时,此RTL逻辑被删除,UnicodeString::t_str()仅被锁定到wchar_t*,以匹配UnicodeString::c_str()不要再使用t_str()了!这就是为什么它现在被标记为已弃用。如果需要将UnicodeString传递给需要Ansi数据的东西,转换为中间AnsiString是正确且安全的方法。这就是现在的样子。