【问题标题】:wcscoll returns different result than expectedwcscoll 返回与预期不同的结果
【发布时间】:2015-08-13 11:13:20
【问题描述】:

考虑这段代码:

#include <wchar.h>
#include <locale.h>
#include <stdio.h>

int main(void) {
    setlocale(LC_ALL, "pl_PL.UTF-8");
    printf("%d\n", wcscoll(L"ą", L"b"));
    return 0;
}

输出是

158

但我希望它是-1,因为 ą 在波兰字母表中就在 b 之前。为什么返回 158?如果不是这样,怎么能按字母顺序比较单词呢?

【问题讨论】:

  • 波兰语语言环境是否实际安装在您的计算机上? sort 实用程序是否使用该语言环境正确排序?调试这类事情的第一步总是检查标准库的返回值,在这种情况下if(setlocale(...) = NULL)...
  • @rici 不,实际上不是。所以我猜它依赖于操作系统?
  • 不,这是您在机器上安装了哪些语言环境的问题。所以它比操作系统更依赖于配置,但我想这取决于你所说的依赖于操作系统的意思。
  • @rici 好吧,它也依赖于操作系统,因为该语言定义的唯一语言环境名称是 "C"。任何其他语言环境都取决于操作系统。
  • @rodrigo:技术上是正确的,但这种情况下的解决方案可能不是“更改您的操作系统”甚至“验证您的操作系统是否支持多个语言环境”。 (我赞成你的回答,没有对后者的检查提出质疑:))

标签: c widechar


【解决方案1】:

我在我的 Linux 机器上尝试过,我得到了 1 作为输出,就像你的一样。

然后我在/etc/locale.gen 编辑了支持的语言环境,取消注释pl_PL.UTF-8(默认情况下未启用),运行sudo locale-gen,现在它给出-4,正如预期的那样,这是负数。

结论是您的系统配置不支持所选的语言环境。

【讨论】:

    【解决方案2】:

    检查setlocale的返回值;它可能无法识别您的国家/地区/代码页字符串。

    MS locale names use dashes, not underscores。如果您使用的是 Windows,请尝试传递 pl-PL 而不是 pl_PL.UTF-8

    【讨论】:

      猜你喜欢
      • 2019-12-27
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 2016-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多