printf从整数中转义unicode字符

时间:2014-11-06 19:59:27

标签: c++ unicode printf

我正在重写这个问题。

我想使用整数常量创建一个带有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"。这与转义的unicode字符"\u03B1"不同。

2 个答案:

答案 0 :(得分:2)

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

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

const char *alpha = "\u03B1"

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

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

答案 1 :(得分:0)

我明白了。

第一个字节包含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);