【问题标题】:Why won't ncurses output all the foreign characters of an UTF8 string? [duplicate]为什么 ncurses 不会输出 UTF8 字符串的所有外来字符? [复制]
【发布时间】:2018-11-18 21:56:13
【问题描述】:

尝试在 ncurses 下获得对 UTF8 的全面支持。我构建了具有广泛字符支持的 ncurses 5.9。如果我有一个 utf8 字符串,如下所示: D0 9D D0 BE D0 B2 D1 8B D0 B9 将在普通控制台中使用 printf 输出 Новый。如果我启动 ncurses 并使用 waddstr,我只会得到一些字符,如:?~]ов?~Kй。为什么它不起作用?嵌入的转义序列 ~] 和 ~K 有什么意义?

我包括宽版本的标头并与内置的宽库链接。

这是使用 open watcom(静态链接)构建的,事实证明 OW 始终使用“C”语言环境,因此重新构建了删除 HAVE_LOCALE_H 的库(在这种情况下允许 ncurses 从环境变量中提取信息@ 987654326@)。所以现在摆脱了~]~K 但仍然得到? ов? й(现在\n 换行不起作用)。

所以这变成了两个额外的问题:

1) ncurses 对 c 库有什么要求? (显然 ncurses 可以很好地处理一些多字节字符,但是这两个仍然有问题)

2) 为什么newline 字符停止工作?

TIA!!

【问题讨论】:

  • 答案是 ncurses 中的一个错误。如果HAVE_WCTOB 未定义但HAVE_WCTOMB 是(最好是缺少#error,因为在这种情况下结果未定义),那么当_nc_is_charablecharable.c 中被调用时,它调用_nc_to_char,然后使用@ 987654338@ 函数并假设返回的 mb 字符串将有一个 z-term 但它可能没有(也没有),所以strlen 检查是不好的。
  • 这东西什么时候可以让我添加最终答案?

标签: c utf-8 ncurses


【解决方案1】:

也许你忘了设置语言环境:

setlocale(LC_ALL, "");

如手册页的Initialization 部分所述。

【讨论】:

  • 这也已经完成了。但是使用setlocale(LC_CTYPE, "");,因为我不希望更改其他语言环境项目,除非用户选择。
  • 如果其他语言环境变量是兼容的(相同的 UTF-8 编码),那通常可以工作。但是,如果 LC_ALL 使用 ISO-8859-1,则 C 库提供的有用结果会减少。
  • 请查看已编辑的原始消息,因为它建议我这样做,因为它不是重复的。
  • 我注意到了(而且建议副本的批准答案不正确)。这就是我在评论中添加说明的原因。
  • 我们将它是编译器,因为它提供了 mb 函数,但它们不做任何事情。所以我不得不将我自己的版本添加到 ncurses 构建中并将它们重新映射到那些版本(以 nc 为前缀)但是,我无法在这方面回答我自己的问题。但是有一个新问题,既然这一切都有效,换行符\n 不再有效?对此有任何想法(以及如何给出答案)?
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-13
  • 2016-09-15
  • 2015-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多