使用带有unicode字符的sprintf

时间:2015-05-28 17:13:28

标签: c unicode

我想用Unicode打印出扑克牌的描述。

代码段:

void printCard(int card){
    char strCard[10];
    sprintf(strCard, "\U0001F0A%x", (card%13)+1);
    printf("%s\n", cardStr);
}

由于\ U需要8个十六进制字符,因此我从编译中得到以下内容:

error: incomplete universal character name \U0001F0A

我可以创建一堆if / else语句并以这种方式打印出卡片,但我希望有一种方法可以让我明确写出每张卡片的Unicode编码。

2 个答案:

答案 0 :(得分:3)

通用字符名称(如\U0001F0A1)由编译器解析。如果您在格式字符串中使用一个,printf将看到该字符的UTF-8表示形式;它不知道如何处理反斜杠转义。 (\n\x2C也是如此;这些是编译器解析的单个字符。)所以你当然无法在运行时计算UCN。

最易读的解决方案是使用一个字符串数组来保存13个不同的卡符号。

这将避免将有关Unicode和UTF-8编码的硬连线知识纳入程序。如果您知道活动区域设置是UTF-8区域设置,则可以将代码点计算为wchar_t,并使用宽字符到多字节标准库函数来生成UTF-8版本。但我完全不相信这是值得的。

答案 1 :(得分:1)

快速而肮脏的UTF-8解决方案:

void printCard(int card) {
    printf("\xF0\x9F\x82%c\n", 0xA1 + card % 13);
}

\U0001F0A1的UTF-8表示形式为F0 9F 82 A1。如果您的终端支持UTF-8和非BMP代码点,如OS / X上的iTerm2,上述代码将正确处理所有13张卡。

涉及将宽字符转换为多字节字符集的替代解决方案使用起来很复杂,并且在wchar_t限制为16位的平台上不起作用。