如何在 C 中将 wchar_t 转换为多字节字符

问题描述

我正在寻找一种将 wchar_t 转换为多字节字符的方法 不使用 wctomb 或任何现成的例程。我必须用 C 来做这件事,而不是 C++,互操作性在这里无关紧要。

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

提前致谢。

解决方法

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

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

所以首先 wchar_t - 它的编码是(或应该是)恒定的,并由您的编译器和环境决定。因此,请阅读有关您的环境和编译器的信息。您指定 Debian,using gcc 然后阅读 gcc documentation,现在 on linux wchar_t 表示 one UCS-4 "character"。请注意,在 Windows 上 wchar_tUTF-16

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

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

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

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

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