在C中理解和编写wchar_t

时间:2014-12-10 12:39:08

标签: c printf wchar-t widechar

我目前正在重写(部分)学校项目的printf()功能。 总的来说,我们需要使用几个标志,转换,长度修饰符来重现函数的行为......

我唯一要做的就是让我陷入困境的是旗帜%C / %S(或%lc / %ls)。

到目前为止,我已经收集到wchar_t是一种可以在多个字节上存储字符的类型,以便接受更多字符或符号,因此几乎与所有语言兼容,无论它们是什么字母和特殊字符。

然而,我无法找到关于wchar机器的外观的具体信息,它的实际长度(显然根据包括编译器,操作系统等几个因素而有所不同)或者如何实际写它们。

提前谢谢

请注意,我们在允许使用的功能方面受到限制。唯一允许的功能是write()malloc()free()exit()。 我们必须能够自己编写任何其他所需的函数。

总结一下,我在这里要问的是如何解释和编写“手动”任何wchar_t字符的一些信息,尽可能少的代码,以便我可以尝试理解整个过程并自己编写代码。

1 个答案:

答案 0 :(得分:5)

wchar_t类似于char,因为它是一个数字,但是当显示char或wchar_t时,我们不希望看到数字,而是与数字对应的绘制字符。从数字到字符的映射既不是char也不是wchar_t,它们依赖于系统。因此char和wchar_t之间的最终用法没有区别,除了它们的大小。

鉴于上述情况,printf(“%ls”)最简单的实现是你知道什么是与char和wchar_t一起使用的系统编码的实现。例如,在我的系统中,char有8位,编码为UTF-8,而wchar_t为32位,编码为UTF-32。因此printf实现只是从UTF-32转换为UTF-8并输出结果。

更通用的实现必须支持不同的可配置编码,并且可能需要检查当前编码是什么。在这种情况下,必须使用wcsnrtombs()或iconv()等函数。