【问题标题】:How to deal with Unicode strings in C/C++ in a cross-platform friendly way?如何以跨平台友好的方式处理 C/C++ 中的 Unicode 字符串?
【发布时间】:2011-02-12 22:57:38
【问题描述】:

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

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

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

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

您可能需要的字符串类型:std::stringstd::wstringstd::tstringchar *wchat_t *TCHAR*CString(ATL 之一)。

您可能遇到的问题:

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

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

我个人会选择std::tstring 方法,但我想看看在必要时如何处理转换。

【问题讨论】:

标签: windows string unicode cross-platform tchar


【解决方案1】:

我只能建议你看看这个库:http://cppcms.sourceforge.net/boost_locale/docs/
它可能会有所帮助,目前它是一个提升候选者,但我相信它会成功。

【讨论】:

【解决方案2】:

如果您编写可移植代码:

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

永远不要使用 TChar,使用编码为 UTF-8 的普通 std::string

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

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

【讨论】:

  • 在visual studio中,当我做std::string msg = "महसुस";时,我看不到它。一切都被问号取代。有什么想法吗?
  • 此答案中引用的 SO 帖子现在是死链接。看来这是一个重要的帖子......
  • 使用 UTF-16 的 windows 不会对大脑造成任何损害。 Windows 从 Windows NT(1993 年发布)开始支持 Unicode。 UTF-8 是在 1992 年 9 月 cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt 才作为一个概念发明的,因此 Windows 无法采用它。事实上,Windows 是 Unicode 的一个非常进步的早期采用者——结果可能为时过早。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2011-05-09
    • 1970-01-01
    • 2011-05-23
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 2014-06-14
    • 1970-01-01
    • 2012-02-23
    相关资源
    最近更新 更多