如何将 ANSI 项目转换为 UNICODE 项目
How to convert a ANSI project into a UNICODE one?
我有一个由Visual Age开发的ANSI C++项目。我想将其转换为Unicode,以便它可以在英语操作系统中正确显示多语言字符。定义UNICODE
宏后,我将所有char
变量更改为wchar_t
。
这是正确的方法吗?源代码中有一些 API 只接受char*
字符串(如 system()
、fopen()
、mkdir()
)。我怎样才能使它们使用wchar_t
字符串,因为代码中的所有字符串都变成了wchar_t
?
有几种表示 unicode 字符串的方法,最常见的是:
- 编码
UTF-8
,存储在char
字符串中 - 编码于
UTF-16
,存储在由16位整数组成的字符串中 - 编码为
UTF-32
,存储在由32位整数组成的字符串中。
对于 UTF-16 和 UTF-32,您必须了解系统的字节顺序,并决定是要以大端序还是小端序传达字符串。
有一个名为 UCS-2
的旧编码,使用此编码,您只能表示低于 0x10000 的 unicode 字符。你不应该使用它,不是所有的汉字都可以用它来表示。
需要注意的另一件事是wchar_t
宽度为 2 个字节或 4 个字节,因此在某些系统上,它可用于保存 UTF-16
,而在其他系统上则UTF-32
字符。
需要注意的另一件事是:大多数字符串长度函数将返回计数的字节数或字数,而不是表示的 unicode 符号数。
我个人更喜欢将所有内容存储在内部和外部UTF-8
,并根据需要转换为 16 或 32 位编码。这样可以避免字节顺序问题。
,如果你确保所有内容都用UTF-8
编码,大多数东西都会起作用。
不知道你在做什么就很难说文本,以及它的来源。 如果你所做的只是阅读它来自文件并显示它,然后只需char
更改为 wchar_t
可能就足够了。 (但在这种情况下,您可能希望考虑坚持使用 char
,并使用 UTF-8。 一旦你开始做得更多,问题变得更加复杂:
-
正如您所观察到的,文件名之类的东西通常会有要
char
. 使用 UTF-8 可以解决此问题,有点,但是哪些字符串是合法的,哪些是不合法的仍然是一个开放问题,并且在很大程度上取决于系统。 -
解析可能会变得更加困难,具体取决于您要的内容努力做。 您可能不得不放弃简单的功能在
<ctype.h>
;C++具有<locale>
的功能,您可以与wchar_t
一起使用,但它们不太容易使用。 和在isspace
或搜索特定分隔符时工作更多或不像宣传的那样,像toupper
这样的事情变得非常有问题(因为没有普遍的一对一上下关系)。 -
读取和写入 UTF-16 或 UTF-32 文件时,字节序成为一个问题。 无论使用的类型和编码如何在内部,
char
每当我导入或导出数据。
总的来说,我倾向于坚持使用 char
和 UTF-8,除非我正在进行重要的解析或文本操作。 其中案例,我会查看 ICU 图书馆,它提供了非常完全支持 UTF-16。 除非我 100% 确定我只需要支持一个平台,永远,我会避免wchar_t
,它没有真正的标准大小或编码;例如,ICU 将其 UTF-16 字符放在一个 unsigned
short
. (对于char
也可以这样说,但是机器 char
不是 8 位是非常罕见的,对于国际化,关于您可能进行的唯一编码遭遇是 UTF-8。
- 将Qt Designer项目转换为C++代码
- 将 VS 32 位项目转换为 64
- 如何使用 emscripten 将使用 zlib 的项目转换为 javascript?
- 将QMAKE项目转换为CMAKE
- 用中断函数将Keil5C项目转换为C++项目错误
- 将Qt项目转换为VC++项目 - 未解析的外部符号
- 在Visual Studio 2010中将控制台项目转换/移植到无形应用程序
- 使用ITK或OpenCV库将现有的VC++项目转换为DLL是可能的吗
- 如何将.ino Arduino项目转换为CMake
- 将 MSVS 2010 项目转换为 MSVS 2012 RC,但出现错误"The C++ standard doesn't provide a hash for this type"
- 将项目转换为 qt5 并将未定义的引用转换为 'vtable for qt5 和 cmake
- C++:使用宏字符串将项目转换为动态变量的简单方法
- 无法更新 DoDataExchange 方法:VS 2000 项目转换为 Visual Studio 2008 或 VS
- 如何将cmake项目转换为Visual Studio等效项
- 我应该将现有的 MFC 项目转换为哪个工具包
- 将 Makefile 项目转换为 Cmake
- STL错误将VS 6项目转换为VS2010
- 您能将Visual Studio 7.10项目转换为Visual Studio 2012吗
- 将Visual Basic 6项目转换为Qt/C++
- 是否有任何应用程序可以将PyQt(带有Python语法)项目转换为Qt(带有c++语法)项目