我正在寻找一种方法,将wchar_t转换为多字节的char,而不使用wc坟墓或任何现成的例程。我必须用C语言,而不是C++语言来做这件事,互操作性在这里并不重要。
我的目标是使用写系统调用逐字节打印wchar。例如,"é"字符相当于编码到wchar中的0xe9,相当于多字节形式的ff ff ff c3
ff ff ff a9
。我如何从一种形式切换到另一种形式?
提前谢谢。
我正在寻找一种将wchar_t转换为多字节字符的方法,而无需使用wc坟墓或任何现成的例程
这与任何两种编码之间的转换相同。首先确定用于编码源和目的地中的字符的编码,然后将字符从一种编码转换为另一种编码。
所以首先wchar_t
-它的编码是(或者应该是(常量,并由编译器和环境决定。因此,请阅读有关您的环境和编译器的信息。您指定了Debian, using gcc
,然后阅读gcc文档,并且现在在linux上wchar_t
表示一个UCS-4
";字符";。请注意,在windows上,wchar_t
是UTF-16
。
然后确定目标编码,多字节字符串的编码——这取决于区域设置。阅读并解析LC_CTYPE
语言环境,您可能需要阅读posix语言环境和关于语言环境命名的内容。然后,由于without using any ready-made routine
在区域设置未指定codeset
的不幸情况下,您必须为特定于locale
的文件编写自己的特定于平台的解析器,并推断特定于当前区域设置的默认字符编码(我真的不确定这里是如何发生的,您必须找到"区域设置语言类别"(。像man 7 locale man 7字符集这样的页面看起来读起来不错。
然后,在确定目标和源编码后,您需要编写一个例程,将一种编码转换为另一种编码。由于without using any ready-made routine
,您不想使用iconv,这意味着您必须自己编写。这涉及到阅读两种编码的规范,以及这些编码中的代码点代表什么字符,然后决定如何将每个代码点从一种编码转换为另一种编码。
总之,其他项目的源代码,如glibc源代码、libiconv或libunistring,可能是灵感的来源。
这是一个学校项目,所以我想一旦你知道了诀窍,就不会那么难了。
很可能多字节编码是UTF-8,unicode在当今世界占据主导地位。因此,您需要研究如何将UTF-32转换为UTF-8,这实际上是一个简单的例程。