You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 19:34:48