16

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

我剩下要做的唯一一件让我陷入困境的事情就是标志%C/ %S(或%lc/ %ls)。

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

但是,我无法找到任何关于wchar机器外观的具体信息,它的实际长度(这显然取决于包括编译器、操作系统......在内的几个因素)或如何实际编写它们。

先感谢您

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

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

4

1 回答 1

13

Awchar_t在它是一个数字的意义上类似于一个char,但是在显示a的时候char我们wchar_t不想看到数字,而是与数字对应的绘制的字符。从数字到字符的映射既不是由也不是定义的charwchar_t它们取决于系统。char因此,wchar_t除了它们的尺寸外,最终用途之间没有区别。

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

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

于 2014-12-13T20:21:15.637 回答