在C中从文本文件读取unicode字符

在C中从文本文件读取unicode字符,c,unicode,C,Unicode,我正在尝试从.pas文件中读取pascal代码,并将其逐行写入控制台。那部分很好用。现在我想在读取的.pas文件中添加土耳其语字符并显示它。 包括在内 #include <locale.h> 这不是您的问题-您只需要正确配置终端仿真器(cmd.exe)编码。C字符串没有编码。它们只是字节序列。您的程序将精确打印文件中可能以UTF-8编码的内容。setlocale只会更改ANSI代码页。它与Unicode不同。如果文件保存在土耳其语代码页中,则代码将起作用。检查文件代码页以确保 要

我正在尝试从.pas文件中读取pascal代码,并将其逐行写入控制台。那部分很好用。现在我想在读取的.pas文件中添加土耳其语字符并显示它。 包括在内

#include <locale.h> 

这不是您的问题-您只需要正确配置终端仿真器(cmd.exe)编码。C字符串没有编码。它们只是字节序列。您的程序将精确打印文件中可能以UTF-8编码的内容。

setlocale
只会更改ANSI代码页。它与Unicode不同。如果文件保存在土耳其语代码页中,则代码将起作用。检查文件代码页以确保

要在Windows控制台中打印Unicode,请使用UTF-16。例如:

#include <Windows.h>
...
HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
const wchar_t *wstr = L"Şperator\n";
DWORD temp;
WriteConsoleW(h, wstr, wcslen(wstr), &temp, 0);

save_chp=&line[MAX_PRINT_line_LENGTH]print
语句在您键入时使用了当前的代码页,所以它可以完美地来回运行,并且您不需要知道它对引擎盖下的字符串使用了哪种eNODING。当您使用不同的编码处理文本时,情况并非如此。从长远来看,简单的解决方案是字符串是字节序列。也在文件中。文本编辑器基本上是写入字节而不是字符。您的程序也将它们视为单独的字节。但是你的终端将它们视为unicode字符,并试图以这种方式显示它们。你甚至不需要设置语言环境-它并没有真正定义编码。它定义了日期格式、货币等内容。
#include <Windows.h>
...
HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
const wchar_t *wstr = L"Şperator\n";
DWORD temp;
WriteConsoleW(h, wstr, wcslen(wstr), &temp, 0);
#include <stdio.h>
#include <windows.h>

int main(void)
{
    HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
    DWORD temp;

    FILE *fp = fopen("utf8.txt", "rb");
    fseek(fp, 0, SEEK_END);
    size_t filesize = ftell(fp);
    fseek(fp, 0, SEEK_SET);
    char *buf = malloc(filesize + 1);
    fread(buf, 1, filesize, fp);
    buf[filesize] = 0;

    int widesize = MultiByteToWideChar(CP_UTF8, 0, buf, -1, 0, 0);
    wchar_t *wbuf = malloc(widesize * 2);
    MultiByteToWideChar(CP_UTF8, 0, buf, -1, wbuf, widesize);
    WriteConsoleW(h, wbuf, widesize, &temp, 0);

    free(buf);
    free(wbuf);

    fclose(fp);

    return 0;
}