如何使用移位序列从另一个字符集中输出一个字符
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) 在您的程序中执行转换。
阅读有关如何使用移位序列打印来自其他字符集的字符,我得到了以下代码(我确信其中的转义序列不正确,但我不知道为什么):
#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) 在您的程序中执行转换。