在C中从文本文件读取unicode字符
我正在尝试从.pas文件中读取pascal代码,并将其逐行写入控制台。那部分很好用。现在我想在读取的.pas文件中添加土耳其语字符并显示它。 包括在内在C中从文本文件读取unicode字符,c,unicode,C,Unicode,我正在尝试从.pas文件中读取pascal代码,并将其逐行写入控制台。那部分很好用。现在我想在读取的.pas文件中添加土耳其语字符并显示它。 包括在内 #include <locale.h> 这不是您的问题-您只需要正确配置终端仿真器(cmd.exe)编码。C字符串没有编码。它们只是字节序列。您的程序将精确打印文件中可能以UTF-8编码的内容。setlocale只会更改ANSI代码页。它与Unicode不同。如果文件保存在土耳其语代码页中,则代码将起作用。检查文件代码页以确保 要
#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]你的问题很可能是编码的问题。我猜你的源文本是用UTF-8编码的。字符Ş为U+015 E,编码为UTF-8序列c5 9e。控制台的编码可能是拉丁文1,其中带环的A是c5,93不是合法的Unicode字符,因此被称为问号。尝试将输出重定向到一个文件,然后以UTF-8编码的方式查看该文件。图片可读性差-将文本作为文本发布。@MOehm,我认为控制台不是问题所在,因为我可以运行此代码setlocale(LC_ALL,“Turkish”);printf(“fistikçi sahap”);在另一个文件中,它会正确地打印出来。我猜问题出在文件读取的某个地方。不要发布代码或错误消息的屏幕截图。如果是这样,为什么当我打印这个printf(“fistikçI sahap”)时,它会打印包含unicode字符的消息?我也更改了cmd编码,但结果仍然是一样的。因为您的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;
}