如何以跨平台友好的方式处理C / C ++中的Unicode字符串?

时间:2010-04-27 16:19:35

标签: windows string unicode cross-platform tchar

在不同于Windows的平台上,您可以轻松使用char *字符串并将其视为UTF-8。

问题是在Windows上,您需要使用wchar *字符串(W)接受和发送消息。如果您将使用ANSI函数(A),则不支持Unicode。

因此,如果您想编写真正的可移植应用程序,则需要在Windows上将其编译为Unicode。

现在,为了保持代码清洁,我想看看处理字符串的推荐方法是什么,这种方法可以最大限度地减少代码中的丑陋。

您可能需要的字符串类型:std::stringstd::wstringstd::tstringchar *wchat_t *TCHAR*,{{1} (ATL one)。

您可能遇到的问题:

  • CString及其Unicode变体cout/cerr/cin
  • 所有重命名的宽字符串函数及其TCHAR宏 - 如wcout,wcerr,wcinstrcmpwcscmp
  • 代码中的常量字符串,使用TCHAR,您必须使用_tcscmp宏填充代码。

您认为哪种方法最好?(欢迎举例)

就个人而言,我会采用_T()方法,但我希望看到如何对必要的转换做。

3 个答案:

答案 0 :(得分:3)

我只建议您查看此库:http://cppcms.sourceforge.net/boost_locale/docs/
它可能有所帮助,它现在是一个提升候选人,但我相信它会成功。

答案 1 :(得分:1)

您可以保留所有字符串UTF-8编码,并在与WIn32 API交互之前将它们转换为UTF-16。查看UTF8-CPP库以获得一些易于使用的转换函数

答案 2 :(得分:1)

如果您编写可移植代码:

1st永远不要使用wchar_t它也不是便携式的,并且它的编码在平台之间没有很好地定义(utf-16 windows / utf-32所有其他)。

永远不要使用TChar,使用纯std::string编码为UTF-8。

在处理Brain Damaged Win32 API时,只需在调用之前将UTF-8字符串转换为UTF-16。

请参阅https://stackoverflow.com/questions/1049947/should-utf-16-be-considered-harmful以及Windows项目如何采用UTF-8作为主要编码。