首页 > 解决方案 > 如何在 C 中将 wchar_t 转换为多字节 char

问题描述

我正在寻找一种将 wchar_t 转换为多字节字符的方法,而不使用 wctomb 或任何现成的例程。我必须在 C 而不是 C++ 中做到这一点,并且互操作性在这里并不重要。

我的目标是使用 write 系统调用逐字节打印 wchar。例如,'é' 字符等价于 0xe9 编码为 wchar,并且等价ff ff ff c3 ff ff ff a9于其多字节形式。我可以从一种形式切换到另一种形式吗?

提前致谢。

标签: cencodingtype-conversionwcharmultibyte-characters

解决方案


我正在寻找一种将 wchar_t 转换为多字节字符的方法,而不使用 wctomb 或任何现成的例程

这与任意两种编码之间的转换相同。首先确定用于对源和目标中的字符进行编码的编码,然后将字符从一种编码转换为另一种编码。

所以首先wchar_t- 它的编码是(或应该是)恒定的,由您的编译器和环境决定。因此,请阅读您的环境和编译器。您指定Debian, using gcc然后阅读gcc 文档,现在在 linux wchar_t上意味着代表一个UCS-4“字符”。请注意,在 windows 上wchar_tUTF-16.

然后确定目标编码,多字节字符串的编码 - 它取决于locale。阅读和解析LC_CTYPE语言环境,您可能需要阅读posix 语言环境和关于语言环境命名。然后由于without using any ready-made routine在没有指定语言环境的可悲情况下codeset,您必须为特定文件编写自己的特定于平台的解析器locale并推断特定当前语言环境的默认字符编码(我不确定它是如何发生的,你必须找到“区域设置语言类别”)。像man 7 locale man 7 charsets这样的页面看起来不错。

然后在确定目标和源编码之后,您需要编写一个例程,将一种编​​码转换为另一种编码。因为without using any ready-made routine您不想使用iconv,这意味着您必须自己编写它。这将读取两种编码的规范以及这些编码中的哪些代码点代表哪些字符,然后决定如何将每个代码点从一种编码转换为另一种编码。

总而言之,另一个项目的源代码,如glibc 源代码libiconvlibunistring可能是灵感的来源。

这是一个学校项目,所以一旦你知道了诀窍,我想并不难。

多字节编码很可能是 UTF-8,unicode 主导当今世界。因此,您需要研究如何将 UTF-32 转换为 UTF-8,这实际上是一个简单的例程。


推荐阅读