【发布时间】:2019-03-18 17:41:28
【问题描述】:
我正在尝试从 .csv 文件中读取 UTF-8 字符串,然后将其写入控制台。
a.csv 内容:
Gijón
在对该主题进行了一整天的研究后,我发现执行此类操作的所谓正确方法应该类似于以下内容:
int main(int argc, char *argv[])
{
char *locale = setlocale(LC_ALL, "");
printf("locale: %s\n", locale);
const int MAX_LINE_SIZE = 1024;
char line[MAX_LINE_SIZE];
wchar_t wline[MAX_LINE_SIZE];
// Attempt 0: no special handling
FILE* stream = fopen("a.csv", "r");
fgets(line, MAX_LINE_SIZE, stream);
printf("%s\n", line); // Expected to print "Gijón", prints "Gijón"
fclose(stream);
// Attempt 1: mbstowcs
mbstowcs(wline, line, MAX_LINE_SIZE);
wprintf(L"%ls\n", wline); // Expected to print "Gijón", prints "Gijón"
// Attempt 2: fgetws
stream = fopen("a.csv", "r");
fgetws(wline, MAX_LINE_SIZE, stream);
wprintf(L"%ls\n", wline); // Expected to print "Gijón", prints "Gijón"
fclose(stream);
// Attempt 3: _wfopen
stream = _wfopen(L"a.csv", L"rb");
fgetws(wline, MAX_LINE_SIZE, stream);
wprintf(L"%ls\n", wline); // Expected to print "Gijón", prints ""
fclose(stream);
// Printing command line parameter
mbstowcs(wline, argv[1], MAX_LINE_SIZE);
wprintf(L"%ls\n", wline); // Properly prints "Gijón"
}
但是运行这个程序会导致:
.\myprogram.exe Gijón
locale: Spanish_Spain.1252
Gijón
Gijón
Gijón
我不认为这是控制台本身的问题,因为argv[1] 转换工作正常。
我错过了什么?
【问题讨论】:
-
适用于 Windows 还是 Linux/Mac?
-
我使用的是 Windows
-
什么是
_wfopen?这不是标准 C 的一部分,不是吗?它似乎是特定于 Microsoft 的。 -
我在这里找到了它:stackoverflow.com/questions/9523951/… 无论如何它似乎对我不起作用,只是拼命尝试让它起作用
-
仅供参考,在 Mac 上,我能够运行您的整个程序 除了 用于特定于 Windows 的
_wfopen,我看到它每次都打印Gijón。我希望 Windows 专家能在此指点一下。我确实知道 Mac 终端程序默认是 UTF-8,所以我怀疑但不能确定 Windows 中有一些控制台设置需要检查。抱歉,目前这里无法访问 Windows。
标签: c windows unicode character-encoding console