C ++:让我的项目支持unicode

时间:2011-03-13 11:02:54

标签: c++ unicode

我的C ++项目目前大约有16K行代码,我承认首先完全没有考虑过unicode支持。

我所做的只是std::string的自定义typedef String并跳转到编码。

我自己从未在我编写的程序中使用过unicode。

  • 现在将项目切换到unicode有多难?它甚至是个好主意吗?

  • 我可以在没有任何重大问题的情况下切换到std::wchar吗?

3 个答案:

答案 0 :(得分:7)

使应用程序能够识别unicode的最重要的部分可能是跟踪字符串的编码,并确保您的公共接口已经明确指定,并且易于使用您希望使用的编码。

切换到更宽的字符(在c ++ wchar_t中)不一定是正确的解决方案。事实上,我认为这通常不是最简单的解决方案。某些应用程序可以通过指定所有字符串和接口使用UTF-8而根本不需要更改来逃脱。 std::string可以很好地用于UTF-8编码的字符串。

但是,如果您需要解释字符串或非UTF-8接口的接口中的字符,那么您将需要投入更多的工作但不了解您的应用程序,因此无法推荐单一的最佳方法。

答案 1 :(得分:2)

使用std::wstring时存在一些问题。如果您的应用程序将以Unicode格式存储文本,并且它将在不同平台上运行,则可能会遇到麻烦。 std::wstring依赖于wchar_t,它取决于编译器。在Microsoft Visual C ++中,此类型为16位宽,因此仅支持UTF-16编码。 GNU C ++编译器将此类型指定为32位宽,因此仅支持UTF-32编码。如果然后将文本存储在一个系统(例如Windows / VC ++)的文件中,然后从另一个系统(Linux / GCC)读取该文件,则必须为此做好准备(在这种情况下,从UTF-16转换为UTF-32)。

答案 2 :(得分:1)

  

我可以在没有任何重大问题的情况下切换到[std::wchar_t]吗?

不,这不是那么简单。

  • wchar_t字符串的编码与平台有关。 Windows使用UTF-16。 Linux通常使用UTF-32。 (C ++ 0x将通过引入单独的char16_tchar32_t类型来缓解这种差异。)
  • 如果您需要支持类Unix系统,那么您没有Windows所具有的所有UTF-16功能,因此您需要编写自己的_wfopen等。
  • 您使用任何第三方图书馆吗? 他们支持wchar_t
  • 虽然宽字符通常用于内存中表示,但磁盘和on-the-Web格式很多更可能是UTF-8(或其他{{1}基于编码)比UTF-16/32。你必须转换它们。
  • 您不能只用char搜索和替换char,因为C ++会混淆“character”和“byte”,您必须确定哪些wchar_t是字符和其中char是字节。