我想用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编码。
答案 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位的平台上不起作用。