printf 从整数中转义 unicode 字符

Posted

技术标签:

【中文标题】printf 从整数中转义 unicode 字符【英文标题】:printf escaped unicode character from integer 【发布时间】:2014-11-06 19:59:27 【问题描述】:

我正在重写这个问题。

我想使用整数常量创建一个带有 unicode 转义字符的字符串,例如 "\u03B1"。例如,这个字符串是希腊字母 alpha。

const char *alpha = "\u03B1"

我想使用整数值0x03B1 调用 printf 来构造相同的字符串。对于这个例子,它可以像这样完成,但我不确定从0x03B1 获得这两个数字。

printf("%c%c", 206, 177);

此链接说明了该怎么做,但我不知道该怎么做。 http://www.fileformat.info/info/unicode/utf8.htm

对于等于或小于 2047(十六进制 0x07FF)的字符,UTF-8 表示分布在两个字节上。第一个字节将有 两个高位设置,第三位清除(即 0xC2 到 0xDF)。这 第二个字节将设置最高位并清除第二个位(即 0x80 到 0xBF)。

注意:我不想创建带有反斜杠的字符串"\\u03B1"。这与 "\u03B1" 不同,后者是一个转义的 unicode 字符。

【问题讨论】:

C 或 C++,选择一个,因为答案会千差万别。 printf("\\u%04x", 1234); 明确您是否希望以字符串'\', 'u', '1', '2', '3', '4', '\0' 结尾,或者您是否尝试构建代码点U+1234 的单个字符 另外,您的控制台是否直接支持宽Unicode字符,还是需要输出UTF8? 如果你想要一个反斜杠,你需要转义它,所以输入其中两个。 printf("\\u%04x", 0x1234) 做你想做的事吗? 【参考方案1】:

似乎即使是最新的 C 和 C++ 标准在处理 Unicode 方面也有些令人失望。

对于那些对问题中的示例感到困惑的人,就像我一样:

const char *alpha = "\u03B1"

在 C99 中,这将在 alpha 中存储指向字符串 "α" (U+03B1) 的指针。在 C89 中,这是无效的语法。

我找不到将\u 语法与变量或整数常量一起使用的方法,就像问题所要求的那样。您最好使用库为您的程序添加更好的 Unicode 支持。我没有用过ICU library,但听起来很有希望。

How to convert a Unicode code point to characters in C++ using ICU?: 可能是你问题的答案 Unicode Processing in C++:一个相关的 Stack Overflow 问题

【讨论】:

对不起,请看我上面编辑的问题。我想创建一个转义的 unicode 字符而不是带有反斜杠的字符串。【参考方案2】:

我想通了。

第一个字节包含 unicode 值的高 5 位 0x7c0 is 11111000000,第二个字节包含 unicode 值的低 5 位 0x3f is 00000111111

第一个字节使用掩码0xc0 is 11000000 设置两个高位,第二个字节使用0x80 is 10000000 设置第一个高位。

int alpha = 0x03B1; // 945
char byte1 = 0xc0 | ((alpha & 0x7c0) >> 6); // 206
char byte2 = 0x80 | (alpha & 0x3f); // 177
printf("%c%c", byte1, byte2);

【讨论】:

您是否考虑了 BOM?

以上是关于printf 从整数中转义 unicode 字符的主要内容,如果未能解决你的问题,请参考以下文章

Haskell:未经请求的unicode字符在i / o中转义

Pymongo在字段名称中转义unicode字符

如何使用 msys (mingw32) 在 tcl 中转义字符串

如何在 freemarker 模板处理中转义 unicode 符号?

从php中的字符串中转义特殊字符

在 Oracle XDB 中转义控制字符