如何解决如何在 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_t
是 UTF-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 code 或 libiconv 或 libunistring 可能是灵感的来源。
这是一个学校项目,所以我想一旦你知道了诀窍就不会那么难了。
最有可能的多字节编码是 UTF-8,unicode 在当今世界占据主导地位。因此,您需要研究如何将 UTF-32 转换为 UTF-8,这实际上是一个简单的例程。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。