【问题标题】:wctomb chokes on per mille symbol (‰)wctomb 扼流圈每千分之一符号 (‰)
【发布时间】:2011-06-16 12:57:07
【问题描述】:

我正在尝试打印一堆单位标签;其中一些包含希腊字符,一些包含其他有趣的代码点。

我将其追溯到 wctomb 不知道如何处理的函数,例如UTF-16 字符 8240:

char mb[10]; 
assert( 0 <= wctomb(mb,8240) );

如何将wctomb 使用的语言环境设置为例如“所有Unicode字符”?

如何从我需要的字符开始找到我需要的正确语言环境名称?

【问题讨论】:

  • 似乎您使用的是 Windows,它在内部使用 UTF-16。因此,如果您已经有一些 UTF-16 字符串,则无需将其转换为其他字符串。

标签: c++ locale utf-16 multibyte widechar


【解决方案1】:

设置正确的 UTF-8 语言环境将修复它;

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

int main()
{
    setlocale(LC_ALL, "en_US.UTF-8");
    char mb[10]; 
    assert( 0 <= wctomb(mb,8240) );
    printf("%s\n", mb);
    return 0;
}

http://ideone.com/sflZj

【讨论】:

  • 哦 ... setlocale 返回 null。
  • @xtofl 你可能没有安装en_US.UTF-8 语言环境,试试C.UTF-8
  • @xtofl:此解决方案不适用于 Windows。您使用哪种操作系统?
  • 在 Windows 上,您不应该使用多字节编码。没有 UTF-8 语言环境,其他语言环境也不涵盖所有 Unicode。 CP1253 包含 ‰ (0x89) 和希腊语,但遗漏了许多其他“有趣”的代码点。
  • 所以在尝试了所有可能的语言环境名称(包括“en_US.UTF-8”)之后,我将语言环境名称减少为“en”,没有运气。然后我将语言环境名称减少为“”......并且setlocale 愉快地返回“English_United States.1252”。我在控制台输出中得到了我的每千分之一!
猜你喜欢
  • 2016-12-06
  • 1970-01-01
  • 2019-04-30
  • 1970-01-01
  • 2012-10-03
  • 2017-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多