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

UTF-8编码文本文件读取乱码:土耳其字符显示异常

问题分析与解决方案

你的乱码问题核心是UTF-8多字节字符被当成单字节处理,加上编码环境不匹配导致的:

  • UTF-8中土耳其字符(如ö、ü、ç)都是2字节序列,你用fgetc逐单字节读取,再用strncat拼接,会把每个字节拆成独立的"字符",终端用系统本地编码(如ISO-8859-9)解析时就会显示成乱码(比如ö的C3 B6会被解析为ö)。
  • setlocale(LC_ALL, "Turkish")设置的是系统本地单字节编码(ISO-8859-9),和文件的UTF-8编码不匹配,所以无法解决问题。

修正方案1:二进制读取UTF-8字节流(推荐用于后续解析)

直接读取文件的原始字节,确保UTF-8序列完整,同时设置终端以UTF-8解析输出:

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

int main() {
    // 设置UTF-8编码的土耳其语环境(不同系统写法有差异)
    // Linux/macOS 使用下面这句
    setlocale(LC_ALL, "tr_TR.UTF-8");
    // Windows 使用下面这句
    // setlocale(LC_ALL, "Turkish_Turkey.65001");

    // 以二进制模式打开文件,避免换行符转换破坏UTF-8字节
    FILE *dosya = fopen("InsertFilePath", "rb");
    if (!dosya) {
        perror("Dosya açma hatası");
        return 1;
    }

    char yazi[1000];
    // 一次性读取字节到缓冲区,预留位置放字符串结束符
    size_t okunan = fread(yazi, 1, sizeof(yazi) - 1, dosya);
    yazi[okunan] = '\0';

    printf("%s", yazi);

    fclose(dosya);
    return 0;
}

修正方案2:使用宽字符处理(适合直接操作字符)

利用宽字符函数读取UTF-8字符,自动处理多字节序列:

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

int main() {
    // 设置UTF-8编码环境
    setlocale(LC_ALL, "tr_TR.UTF-8"); // Linux/macOS
    // setlocale(LC_ALL, "Turkish_Turkey.65001"); // Windows

    // Windows需要指定ccs=UTF-8强制以UTF-8打开文件;Linux/macOS直接用"r"即可
    FILE *dosya = fopen("InsertFilePath", "r, ccs=UTF-8");
    if (!dosya) {
        perror("Dosya açma hatası");
        return 1;
    }

    wchar_t yazi[1000];
    // 读取宽字符字符串
    fgetws(yazi, sizeof(yazi)/sizeof(wchar_t), dosya);

    // 输出宽字符
    wprintf(L"%ls", yazi);

    fclose(dosya);
    return 0;
}

额外注意事项

  1. 终端编码设置:确保终端的编码是UTF-8(Linux/macOS默认一般是,Windows可以在cmd中执行chcp 65001切换)。
  2. void main()的问题:该写法不符合C标准,规范写法是int main()并返回整数状态码。
  3. 缓冲区安全:你的原代码中strncat循环拼接可能导致缓冲区溢出,fread更安全且高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 14:05:29