繁体   English   中英

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

[英]How to convert wchar_t to multi-bytes char in C

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

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

提前致谢。

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

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

所以首先wchar_t - 它的编码是(或应该是)常量,由您的编译器和环境确定。 因此,请阅读您的环境和编译器。 You specified Debian, using gcc then read gcc documentation and nowadays on linux wchar_t is meant to represent one UCS-4 "character" . 请注意,在 windows wchar_t上是UTF-16

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM