我想用C++编写一个应该在Unix和Windows上运行的程序.该程序应该能够同时使用:Unicode和非Unicode环境.其行为应仅取决于环境设置.
我想要的一个很好的功能是操作从目录中读取的文件名.这些可以是unicode ......或者不是.
实现这一目标的最简单方法是什么?
我想用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++运行时库.
这样做的结果是:
这为跨平台代码创造了同样多的复杂性.如果您只选择一个Unicode编码并坚持使用它会更容易.
综上所述:
是标准的C++"宽字符"类型.但它的编码并不是标准化的:它在Windows上是UTF-16,在Unix上是UTF-32.除了那些使用依赖 于语言环境的wchar_t编码作为东亚编程遗留问题的平台.
如果要使用UTF-32,请使用uint32_t或等效的typedef来存储字符.或者使用wchar_tif __STDC_ISO_10646__定义和uint32_t.
新的C++标准将具有char16_t和char32_t,这将有望消除对如何表示UTF-16和UTF-32的困惑.
是定义时(假定为"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并且只处理用于读取遗留数据的遗留编码(或者编写它,但仅在明确要求时才这样做)会好得多.
| 归档时间: |
|
| 查看次数: |
4108 次 |
| 最近记录: |