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

时间:2015-02-02 10:47:14

标签: c character-encoding internationalization escaping shift-jis

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

#include <stdio.h>

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

这对我来说不起作用,因为它会输出一个&#34;?&#34;在终端而不是角色&#34;ウ&#34;。我的字体确实支持该角色。如果有人能够解释我做错了什么,以及我将如何纠正这个问题(仍然使用班次序列),那将非常感激。

谢谢

2 个答案:

答案 0 :(得分:1)

如果您执行echo 'ウ' >/tmp/x && od -x /tmp/x会发生什么 - 您是否看到上面示例中使用的十六进制字符相同?我不打赌,而且我已根据这个赌注得出了这个答案。

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

您的终端设置为UTF-8(或者更可能是默认为UTF-8),因此UTF-8可以工作,但Shift-JIS不能。

答案 1 :(得分:1)

您使用的是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)在程序中执行转换。