我的程序如何从ASCII切换到Unicode?

Szy*_*ski 7 c++ unicode

我想用C++编写一个应该在Unix和Windows上运行的程序.该程序应该能够同时使用:Unicode和非Unicode环境.其行为应仅取决于环境设置.

我想要的一个很好的功能是操作从目录中读取的文件名.这些可以是unicode ......或者不是.

实现这一目标的最简单方法是什么?

dan*_*n04 9

我想用C++编写一个应该在Unix和Windows上运行的程序.

首先,确保您了解Unix如何支持Unicode与Windows如何支持Unicode之间的区别.

在Unicode之前的日子里,两个平台的相似之处在于每个语言环境都有自己的首选字符编码.字符串是数组char.一个char=一个字符,除了少数使用双字节编码的东亚语言环境(由于非自同步而难以处理).

但他们以两种不同的方式接近Unicode.

Windows NT早期采用Unicode,当时Unicode旨在成为固定宽度的16位字符编码.Microsoft使用16位字符(wchar_t)而不是8位字符编写了一个全新版本的Windows API .为了向后兼容,他们保留了旧的"ANSI"API并定义了大量的宏,因此您可以根据是否_UNICODE定义来调用"ANSI"或"Unicode"版本.

在Unix世界(特别是贝尔实验室的Plan 9)中,开发人员认为扩展Unix现有的东亚多字节字符支持以处理3字节字符会更容易,并创建了现在称为UTF-8的编码.近年来,类Unix系统一直将UTF-8作为大多数语言环境的默认编码.

从理论上讲, Windows 可以扩展其ANSI支持以包括UTF-8,但由于对字符最大大小的硬编码假设,它们仍然没有.因此,在Windows上,您会遇到不支持UTF-8的OS API和不支持UTF-8的C++运行时库.

这样做的结果是:

  • UTF-8是在Unix上使用的最简单的编码.
  • UTF-16是在Windows上使用的最简单的编码.

这为跨平台代码创造了同样多的复杂性.如果您只选择一个Unicode编码并坚持使用它会更容易.

应该是哪种编码?

请参阅UTF-8或UTF-16或UTF-32或UCS-2

综上所述:

  • UTF-8允许您保留8位代码单元的假设.
  • UTF-32允许您保持固定宽度字符的假设.
  • UTF-16很糟糕,但由于Windows和Java,它仍然存在.

wchar_t的

是标准的C++"宽字符"类型.但它的编码并不是标准化的:它在Windows上是UTF-16,在Unix上是UTF-32.除了那些使用依赖语言环境的wchar_t编码作为东亚编程遗留问题的平台.

如果要使用UTF-32,请使用uint32_t或等效的typedef来存储字符.或者使用wchar_tif __STDC_ISO_10646__定义和uint32_t.

新的C++标准将具有char16_tchar32_t,这将有望消除对如何表示UTF-16和UTF-32的困惑.

TCHAR

是定义时(假定为"ANSI")的Windows typedef wchar_t(假定为UTF-16),否则为.它旨在处理上面提到的重载Windows API._UNICODEchar

我看来,很TCHAR糟糕.它结合了平台相关char的缺点和平台相关的缺点wchar_t.躲开它.

最重要的考虑因素

字符编码是关于信息交换的.这就是"II"代表ASCII的含义.你的程序不存在于真空中.您必须读取和写入文件,这些文件更可能以UTF-8编码而不是UTF-16编码.

另一方面,您可能正在使用使用UTF-16(或更少见的UTF-32)字符的库.在Windows上尤其如此.

我的建议是使用最小化您必须执行的转换的编码形式.

该程序应该能够同时使用:Unicode和非Unicode环境

让你的程序在内部完全使用Unicode并且只处理用于读取遗留数据的遗留编码(或者编写它,但在明确要求时才这样做)会好得多.

  • 至少有一些支持代理对的上下文.http://msdn.microsoft.com/en-us/library/dd374069%28VS.85%29.aspx (2认同)