【问题标题】:Understanding and writing wchar_t in C在 C 中理解和编写 wchar_t
【发布时间】:2015-02-08 15:51:26
【问题描述】:

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

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

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

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

提前谢谢你

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

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

【问题讨论】:

  • 我将首先缩小wchar_t 在您的情况下的含义。在大多数 *nix 系统上,这意味着 UTF-32。在 Windows 上,它表示 UTF-16。之后,您需要决定您的狭窄char 将是什么。在大多数 *nix 系统上,它意味着 UTF-8。好消息是 Unicode 表示之间的转换非常明确。
  • sizeof(wchar_t) 应该仍然可以工作,对吧?
  • @Kninnug - 它确实有效,并返回 4 个字节。
  • @Mgetz - 它似乎是 UTF-32(学校的 MAC OSX。我会在家里尝试 debian)。因此,如果我的回答正确,我的目标是尝试将 UTF-32 字符转换为 UTF-8 字符,对吗?
  • @kRYOoX 我的评论是提供指导,而不是为你做作业。

标签: c printf wchar-t widechar


【解决方案1】:

wchar_t 与 char 类似,因为它是一个数字,但在显示 charwchar_t 时,我们不想看到数字,而是与数字对应的绘制字符.从数字到字符的映射既不是由char 也不是wchar_t 定义的,它们取决于系统。所以charwchar_t的最终用法没有区别,只是它们的大小不同。

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

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

【讨论】:

  • 实际上,如果定义了__STDC_ISO_10646__,则wchar_t 应该存储Unicode 代码点值,截至该宏中指定的日期。参见 ISO C 6.10.8.2
  • 如果 STDC_ISO_10646 没有定义,那么 wchar_t 不需要存储 Unicode 码位值。
  • 这几乎是我根据@Mgetz 对我的问题的评论所猜测的。不过还是谢谢你的确认。通过对 Unicode 编码以及如何操作它的更多阅读,我能够实现我所需要的。
猜你喜欢
  • 2012-05-13
  • 2012-12-25
  • 2019-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多