将ANSI C字符串转换为UNICODE

j

注意:我正在尝试编写自己的函数来执行此转换

我知道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_ts,即使它具有类型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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将字符串转换为unicode

来自分类Dev

将unicode的字符串表示形式转换为unicode

来自分类Dev

如何将字符串转换为Unicode字符

来自分类Dev

将字符串转换为Unicode字符

来自分类Dev

PAnsiChar 会将 Unicode 字符串转换为 Ansi 字符串的指针吗?

来自分类Dev

将字符串转换为C#Unicode字符文字序列

来自分类Dev

Python3-将Unicode文字字符串转换为Unicode字符串

来自分类Dev

UnicodeDecodeError:将类型字符串转换为unicode

来自分类Dev

如何使用PostgreSQL将字符串转换为unicode?

来自分类Dev

将\ u转义的Unicode字符串转换为ASCII

来自分类Dev

VBA-将字符串转换为UNICODE

来自分类Dev

Javascript,将unicode字符串转换为Javascript转义?

来自分类Dev

将Unicode字符串转换为汉字

来自分类Dev

将时间的unicode字符串转换为datetime对象

来自分类Dev

PHP-将字符串转换为unicode

来自分类Dev

将Unicode转换为Python 2中的字符串

来自分类Dev

将字符串转换为unicode视图

来自分类Dev

将\ u转义的Unicode字符串转换为ASCII

来自分类Dev

如何使用PostgreSQL将字符串转换为unicode?

来自分类Dev

VBA-将字符串转换为UNICODE

来自分类Dev

将unicode字符串转换为wchar_t

来自分类Dev

PHP-将字符串转换为unicode

来自分类Dev

将Unicode转换为Python 2中的字符串

来自分类Dev

Python:将unicode变量转换为字符串变量

来自分类Dev

将Unicode字符串转换为嵌套列表

来自分类Dev

Java将unicode代码点转换为字符串

来自分类Dev

将unicode字符串转换为float

来自分类Dev

将时间的unicode字符串转换为datetime对象

来自分类Dev

将 unicode 代码点数组转换为字符串