提问人:Mr Cake 提问时间:5/15/2023 更新时间:5/15/2023 访问量:49
我正在尝试读取 csv 文件并打印它。我得到了我想做的事情,但我不确定如何打印韩文字符
I am trying to read a csv file and print it. I got what I wanted to do, but I'm not sure how I can print Korean characters
问:
我有一个包含韩文字符的 csv 文件。但是我不确定如何在我拥有的代码中打印韩语。
csv 文件如下所示:
name,hp,damage
대학오리,20,5
대학냥이,30,10
시계탑기린,100,20
我的代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char name[1000];
int hp;
int damage;
} Monster;
typedef struct {
char header1[sizeof "name"];
char header2[sizeof "hp"];
char header3[sizeof "damage"];
} Header;
int main()
{
FILE* fp = fopen("entityData.csv", "r");
if (!fp) {
printf("Error opening file\n");
return 1;
}
Monster monsters[100];
int num_records = 0;
char line[100];
Header header;
fgets(line, sizeof line, fp);
strncpy(header.header1, strtok(line, ","), sizeof header.header1);
strncpy(header.header2, strtok(NULL, ","), sizeof header.header2);
strncpy(header.header3, strtok(NULL, "\n"), sizeof header.header3);
while (fgets(line, sizeof(line), fp))
{
char* token = strtok(line, ","); //, 기준으로 나눠서 token에 저장
strncpy(monsters[num_records].name, token, 20);
token = strtok(NULL, ",");
monsters[num_records].hp = atoi(token);
token = strtok(NULL, ",");
monsters[num_records].damage = atoi(token);
num_records++;
}
for (int i = 0; i < num_records; i++)
{
printf("%s:%s %s:%d %s:%d\n",
header.header1, monsters[i].name,
header.header2, monsters[i].hp,
header.header3, monsters[i].damage);
}
fclose(fp);
return 0;
}
我编写的程序读取上面的 csv 文件,并应按如下方式打印:
name:대학오리 hp:20 damage:5
name:대학냥이 hp:30 damage:10
name:시계탑기린 hp:100 damage:20
相反,名称部分被破坏了。
经过一番搜索,我意识到韩文字母每个字母占用 2 个字节,这与 char 类型不匹配。我尝试过使用 wchar,但这导致了错误,我觉得我被卡住了。
我知道在英文网站上问这样的问题并不是最好的,但我真的只是希望有人知道什么。
答:
2赞
Mark Adler
5/15/2023
#1
你的代码没有错。是 Windows 搞砸了。(它在 Linux 和 Mac 上运行良好。执行此操作可解决 Windows 问题:
在 Windows 设置中启用新的 UTF-8 选项。转到语言 设置,单击“管理语言设置”,然后单击“更改系统” 现场。。。并勾选 Beta:将 Unicode UTF-8 用于全球语言 支持选项。重新启动计算机。
然后 UTF-8 语言将在终端中正确显示。
是的,字节数可以大于字符数。它们可能存储为 UTF-8,它将每个字符编码为 1 到 4 个字节。每个韩语字符都是三个字节(而不是两个)。但是,逗号仍然是逗号,不能出现在另一个字符代码中,因此您可以正确地找到名称字符串的末尾。
有关 Windows 中字符编码的更多信息,请参阅此答案。
评论
0赞
n. m. could be an AI
5/15/2023
您真的不知道文件是否编码为 UTF-8。在 Windows 上,这不是给定的。
0赞
Paul Dempsey
5/15/2023
您无法确定地知道任意文件在任何系统上的编码。不仅仅是它是否是 UTF-8,而且文件可以来自任何地方,因为互联网。但是,检查文件是否有效 UTF-8(解码为 Unicode)是一种非常好的启发式方法。如果它失败了,那么如果它不是带有文件签名的 Unicode,那么它很有可能与当前系统代码页是相同的代码页。
0赞
n. m. could be an AI
5/15/2023
@PaulDempsey幸运的是,OP不需要。只有一个文件可以使用,并且知道它包含哪些抽象字符,因此 OP 可以确定编码。我们不能,因为将文件的内容粘贴到 SO 问题不会保留其原始编码。
评论