如何使用移位序列从另一个字符集中输出一个字符

How does one use shift sequences to output a character from another character set

阅读有关如何使用移位序列打印来自其他字符集的字符,我得到了以下代码(我确信其中的转义序列不正确,但我不知道为什么):

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("\x1B\x28\x49\x0E\xB3"); /* Should print: ウ */
    return 0;
}

但这对我不起作用,因为它输出“?”在终端而不是字符“ウ”。我的字体确实支持这个字符。如果有人可以解释我做错了什么以及我将如何纠正这个问题(仍然使用移位序列),将不胜感激。

谢谢

如果您这样做会怎样 echo 'ウ' >/tmp/x && od -x /tmp/x - 您看到的十六进制字符是否与您在上面的示例中使用的相同?我打赌不会,我的答案是基于那个赌注。

您的 cat 有效,因为 在您的源文件中编码为 UTF-8。

您将终端设置为 UTF-8(或者更可能只是默认设置为 UTF-8),因此 UTF-8 有效,但 Shift-JIS 无效。

您正在使用 ISO-2022-JP-3。因此,您需要按如下方式编写程序:

int main ()
{
    // switch to JIS X 0201-1976 Kana set (1 byte per character)
    printf ("\x1B(I");

    printf ("\x33"); /* ウ */

    // mandatory switch back to ASCII before end of line
    printf ("\x1B(B");

    printf ("\n");

    return 0;
}

但请注意,它不太可能是终端期望的字符集(在 linux 上,这很可能是 UTF-8)。您可以使用 iconv 执行转换:

$ ./main | iconv -f ISO-2022-JP-3

或者,您可以使用 iconv(3) 在您的程序中执行转换。