【问题标题】:Why the function wsetlocale() is needed for unicode encoding?为什么 unicode 编码需要函数 wsetlocale()?
【发布时间】:2019-01-11 03:35:19
【问题描述】:

我了解到 Unicode 可以区分许多用于其他语言(例如中文)的字符。然后,如果我们决定编码,例如 Utf-16,我认为不需要设置语言环境。但实际上并非如此。即使是 Unicode,也需要 _wsetlocale()。我想知道为什么。

_wsetlocale(LC_ALL, L"korean"); 
wchar_t a = L'개';
wcout << a << endl;

像这样。我设置的字符集不是 MBCS,而是 Unicode。为什么我必须为 unicode 设置语言环境?

【问题讨论】:

  • wchar_t 无法存储所有 Unicode 字符,它没有足够的位来存储
  • @JVApen 这取决于系统。一些 wchar_ts 是 32 位的。请参阅cppreference,它说,大到足以表示任何受支持的字符代码点(在支持 Unicode 的系统上为 32 位。一个值得注意的例外是 Windows,其中 wchar_t 是 16 位并保存 UTF-16 代码单元) i>.

标签: c++ unicode locale setlocale


【解决方案1】:

主要原因是为了与wcscasecmp 等库函数进行不区分大小写的字符串比较。此外,与使用传统的 strcmp 和 wcscmp 函数相比,strcoll 和 wcscoll 库函数可能对某些字符串进行不同的评估。此答案here 的更多详细信息。

有关语言环境如何影响 c 和 c++ 运行时的更多详细信息,请参阅setlocale 的手册页。

【讨论】:

  • 是的。一个值得注意的情况是字母i,其中大写版本在某些语言环境中是I,但在其他语言环境中是İ
  • @MrLister 你的意思是 Unicode 不区分 I 和 İ?
  • @Mona04 不,我不是那个意思。它们是两个不同的字母。我的评论是作为塞尔比回答的一个例子。对于不区分大小写的比较,iİ 在某些语言环境中相等,但在其他语言环境中不相等。 Iİ 不相等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 2019-02-12
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
相关资源
最近更新 更多