我的程序如何从ASCII转换到Unicode? 我想编写一个C++程序,它应该在UNIX和Windows上工作。这个程序应该能够同时使用:Unicode和非Unicode环境。其行为应仅取决于环境设置

我的程序如何从ASCII转换到Unicode? 我想编写一个C++程序,它应该在UNIX和Windows上工作。这个程序应该能够同时使用:Unicode和非Unicode环境。其行为应仅取决于环境设置,c++,unicode,C++,Unicode,我想拥有的一个很好的特性是操纵从目录中读取的文件名。这些可以是unicode。。。或者不是 实现这一点最简单的方法是什么?您必须决定要使用哪种Unicode编码,例如UTF-8、ISO-8859-1等 然后,在所有的字符串操作中,C++中都应该考虑到这一点。例如,看看w_char和wstring。 在非Unicode环境中,我假设您的意思是输入变量将仅为ascii 我见过的最好的方法是使用typedefs和一些基于条件编译定义的宏。例如: #ifdef UNICODE #define mycha

我想拥有的一个很好的特性是操纵从目录中读取的文件名。这些可以是unicode。。。或者不是


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

您必须决定要使用哪种Unicode编码,例如UTF-8、ISO-8859-1等 然后,在所有的字符串操作中,C++中都应该考虑到这一点。例如,看看w_char和wstring。
在非Unicode环境中,我假设您的意思是输入变量将仅为ascii

我见过的最好的方法是使用
typedef
s和一些基于条件编译定义的宏。例如:

#ifdef UNICODE
#define mychar wchar_t
#define s(a) L ## a
typedef std::wstring mystringa;
#else
#define mychar char
#define s(a) a
typedef std::string mystringa;
#endif
typedef std::basic_string<mychar> mystringb;
#ifdef UNICODE
#定义mychar wchar\t
#定义s(a)L#a
typedef std::wstring mystringa;
#否则
#定义mychar
#定义s(a)a
typedef std::字符串mystringa;
#恩迪夫
typedef std::basic_字符串mystringb;

等等。然后将字符串用作
s(“foo”)
mystringa(s(“foo”)。我展示了两种创建字符串类型的方法。两者都可以。

您必须决定如何在内部表示文本。
这应该是恒定的,无论你选择什么

然后,无论何时读取任何输入,都必须将代码从输入格式转换为内部格式。然后从内部格式到输出格式就出来了。如果您碰巧在内部和外部使用相同的格式,这将成为标识操作

UTF-8非常适合存储和传输,因为它具有良好的压缩性能。
但我不喜欢它作为一个内部表示,因为它有可变的长度

UTF-16:被认为是全人类的救世主。
但很快就被UTF-32取代了

UTF-32:已修复。因此非常适合内部表示和操作。
易于与UTF-8进行转换。
非常庞大(每个字符占用4个字节)

大多数操作系统要么已经转换为UTF字符串表示,要么正在朝着这个方向发展。因此,在内部使用onld obsolte格式(如ISO-8859)只意味着在字符串转换为UTF或从UTF转换为UTF时,对操作系统的调用将导致额外的工作。因此,(对我来说)这似乎是浪费时间。

区域设置标识符“”(空字符串)指定了特定于实现的默认区域设置。因此,如果您将全局语言环境设置为
std::locale(“”
),那么理论上,您将获得一个基于环境语言环境设置初始化的默认语言环境。这和标准C++给你的帮助差不多。

这在Windows上有一些主要限制,MSVC不提供任何带有UTF-8编码的std::locale。Mac OS X除了与文化无关的“C”语言环境外,不提供任何std::语言环境

在实践中,在应用程序内部的任何地方都可以标准化UTF-8编码的std::string。然后,在需要与操作系统交互的特定情况下,根据需要进行代码转换。例如,在unix上使用UTF-8编码的const char*定义文件名,而在windows上使用UTF-16编码的wchar*定义文件名

UTF-8是一种广泛推荐的内部字符集,适用于便携式应用程序。UTF-16与UTF-8具有相同的可变宽度编码问题,并且对许多语言使用了更多的空间。此外,UTF-16还增加了字节排序问题,在unix上的支持相对较少。UTF-32是最简单的编码,但它也占用了最多的空间,并且在windows上没有本机支持

我想用C++编写一个程序 应该可以在Unix和Windows上工作

首先,确保您了解Unix支持Unicode与Windows支持Unicode的区别

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

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

Windows NT在早期采用Unicode,当时Unicode是一种固定宽度的16位字符编码。微软用16位字符(
wchar\t
)而不是8位字符编写了一个全新版本的Windows API。为了向后兼容,他们保留了旧的“ANSI”API并定义了大量宏,因此您可以根据是否定义了
\u Unicode
调用“ANSI”或“Unicode”版本

在Unix世界(特别是贝尔实验室的Plan 9),开发人员决定更容易扩展Unix现有的东亚多字节字符支持,以处理3字节字符,并创建了现在称为UTF-8的编码。近年来,类Unix系统已使UTF-8成为大多数地区的默认编码

Windows理论上可以扩展其ANSI支持以包括UTF-8,但是,由于硬编码假设字符的最大大小。因此,在Windows上,你会被一个不支持UTF-8和C++运行库的OS API所支持,而它不支持UTF-8。 结果是:

  • UTF-8是Unix上最容易使用的编码。
  • UTF-16是在Windows上使用的最简单的编码。
这给跨平台代码带来了听起来一样多的复杂性。如果您只选择一种Unicode编码,并坚持使用它,这会更容易

应该是哪种编码? 看

总之:

  • UTF-8允许您保留8位代码单元的假设
  • UTF-32允许您保留假设