注意:我正在尝试编写自己的函数来执行此转换
我知道achar
是1个字节,而awchar_t
是2个字节。
所以这就是转换的方式:
1)输入文字
Hello, world
2)获取字符串的字节
48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 21
3)分配内存两倍的字节数
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
4)用ANSI值填充一个字节,一次跳过一个字节
48 00 65 00 6c 00 6c 00 6f 00 2c 00 20 00 77 00 6f 00 72 00 6c 00 64 00 21 00
关于此过程,我有几个问题:
1)我可以简单地将ANSI字符串转换为UNICODE并使其复制上面的确切过程,还是用ANSI字节简单地填充字节的前半部分,而将其余部分保留为0?
char a[] = { "Hello, world!" };
wchar_t* b = reinterpret_cast<wchar_t*>(a);
2)查看MultiByteToWideChar函数,我看到一个CodePage
参数,并且想知道它是什么。转换是否完全一样(据我所了解并在上面写出)?我以为ASCII字符代码在任何地方都是相同的,但是如果我从Mac和Windows的值中正确理解这一说法,似乎可以说是另外一种说法。
我以为ASCII字符代码在任何地方都是相同的,但是如果我从Mac和Windows的值中正确理解这一说法,似乎可以说是另外一种说法。
的确是ASCII码,但是“扩展ASCII”字符串的高位(扰流器:没有这样的东西)映射到大量代码页中的任何一个,所有不同的编码主要用于不同的地理位置。您采用的方法适用于简单的普通ASCII情况,但通常无法正常工作,并且MultiByteToWideChar
知道这一点。它会从您使用的任何代码页正确地重新编码为Windows令人困惑的“ Unicode”(不是“ UNICODE”),实际上是“ UTF-16”编码。
我是否可以将ANSI字符串简单地转换为UNICODE并使其复制上面的确切过程,还是用ANSI字节简单地填充字节的前半部分并将其余部分保留为0?
否。强制转换不会重新编码事物或更改值。您只是在说“我保证那a
是一堆wchar_t
s,即使它具有类型char*
(它没有,它也具有数组类型,但是对于今天来说足够接近)。
如果使用b
,该代码实际上具有未定义的行为,因为您违反了别名规则(您可以T
通过来检查a char*
,但是不能将achar[]
视为T
从未创建的对象)。但是,如果没有,您会发现“字符串”现在长度的一半,而且很有可能是无效的UTF-16序列,无法在任何地方正确呈现。
因此,如果我想支持UTF-32,我将不得不为字符串创建自己的包装器,因为wchar_t只有2个字节长,而我需要4个字节,而且例如,我将无法使用printf打印它,对吗?
从技术上讲,是可以的(尽管您会使用libicu之类的库,而不是自己动手使用)。
但是,实际上,您不想使用UTF-32。使用Windows API时,您会遇到UTF-16的困扰,但除此之外,我们通常更喜欢使用UTF-8而不是char
,它既美观又可移植,并且灵活,友好。(不过,您将再次为此想要一个库。)
然后由您决定执行相关转换的位置,和/或是否要根据平台(例如Windows的旧UNICODE
宏)将开关从UTF-8切换到UTF-16,还是只运行UTF-到处都是8,直到达到Windows API边界。
或者,如果您隐含地表示所有输入都是ASCII,那么您实际上不需要做其他事情:要么在整个程序中保留ASCII,然后在使用Windows API时将其转换为UTF-16,或者wchar_t
在整个程序中都使用UTF-16(和s,并且没有任何转换。请确保使用您喜欢的函数的宽字符版本,不过,例如wprintf
)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句