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

已将终端编码设为UTF-8仍无法输入UTF-8字符,C代码读取失败求助

问题原因与解决方案

问题核心原因

å属于UTF-8编码的字符,占用2个字节(十六进制为0xC3 0xA5),但你代码中使用的char是单字节数据类型,只能存储该字符的其中一个字节:

  • 当输入å时,scanf("%c")仅读取第一个字节0xC3,这个字节对应的是不可打印的控制字符;
  • 后续用%c输出该字节时,自然看不到任何可见内容;
  • 尽管终端已设置为UTF-8编码(代码页65001),但C标准库的单字节输入输出函数(scanf/printf)不支持多字节的UTF-8字符解析。

解决方案

方案1:使用宽字符类型处理

改用宽字符相关函数,并设置本地化环境以支持UTF-8:

#include <stdio.h>
#include <wchar.h>
#include <locale.h>

int main(void) {
    setlocale(LC_ALL, ""); // 初始化本地化环境,适配系统UTF-8设置
    
    wchar_t myChar;

    wprintf(L"Enter the letter å: ");
    wscanf(L"%lc", &myChar);
    wprintf(L"Entered letter: %lc\n", myChar);

    return 0;
}

方案2:用字符数组存储多字节序列

如果需要保留单字节处理逻辑,可以用字符数组存储完整的UTF-8字节序列:

#include <stdio.h>

int main(void) {
    char myChar[3]; // UTF-8常用字符最多占3字节,å占2字节

    printf("Enter the letter å: ");
    scanf("%2s", myChar); // 读取最多2个字节,匹配å的长度
    printf("Entered letter: %s\n", myChar);

    return 0;
}

注意事项

  • 确保终端的UTF-8编码设置生效(你已通过intl.cpl和chcp 65001完成此配置);
  • 宽字符方案中,setlocale(LC_ALL, "")是关键,它会让宽字符函数识别系统的UTF-8区域设置。

内容的提问来源于stack exchange,提问作者Alexander Jonsson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 17:10:24