如何在C语言中从整数打印128-255区间的扩展ASCII字符?
解决UTF-8终端下打印ISO-8859-1扩展ASCII字符的问题
你的问题核心是编码不匹配:Ubuntu 20.04终端默认使用UTF-8编码,而你说的“扩展ASCII”通常指ISO-8859-1(单字节编码),两者对128-255区间的字符处理逻辑完全不同:
- 直接
printf("Â")时,编译器会把字符串字面量转换成UTF-8的双字节序列输出,终端能正确解析显示。 - 但
printf("%c", 194)只输出单个字节0xC2,这在UTF-8中是不完整的首字节(UTF-8中0xC0-0xDF开头的字节必须跟随一个0x80-0xBF的字节),所以终端显示乱码�。
下面是两种可行的解决方法:
方法一:切换终端到ISO-8859-1编码
在终端执行以下命令,临时切换编码:
export LC_ALL=iso_8859_1
之后运行你的程序,printf("%c", 194)就能正确输出Â。
如果需要恢复UTF-8编码,执行:
export LC_ALL=en_US.UTF-8
注意:切换编码后,中文或其他多字节字符会显示乱码,适合仅测试扩展ASCII字符的场景。
方法二:在UTF-8终端下输出对应字符的多字节序列
如果你想保持终端UTF-8不变,需要输出ISO-8859-1字符对应的UTF-8字节序列,或者使用宽字符输出:
方式1:手动输出UTF-8字节
比如ISO-8859-1的194(Â)对应的UTF-8是双字节0xC2 0x82,可以直接输出这两个字节:
#include <stdio.h> int main() { putchar(0xC2); putchar(0x82); putchar('\n'); return 0; }
方式2:使用宽字符输出
通过设置locale,用宽字符类型wchar_t输出Unicode码点(ISO-8859-1的字节值等于对应的Unicode码点):
#include <stdio.h> #include <wchar.h> #include <locale.h> int main() { // 设置locale为UTF-8 setlocale(LC_ALL, "en_US.UTF-8"); // ISO-8859-1的194对应Unicode码点U+00C2 wchar_t c = 0x00C2; wprintf(L"%lc\n", c); return 0; }
补充说明
32-127区间的字符在ASCII、ISO-8859-1和UTF-8中是兼容的,所以printf("%c", 35)能正常输出#,但128-255区间的字符在UTF-8中是多字节编码,无法用单个字节表示。
内容的提问来源于stack exchange,提问作者someonearth
相关产品推荐
相关产品推荐

