使用C代码在windows上读取带波兰字符的文件名

使用C代码在windows上读取带波兰字符的文件名,c,winapi,utf-8,C,Winapi,Utf 8,我必须指出,目前为windows平台开发代码对我来说是个谜 我在浏览目录和读取存在波兰字符的文件时遇到问题。以下代码片段在英语和波兰语版本的windows上工作,但不是德语版本。原因是什么?我已经尝试过POSIXopendir()/readdir()和winapiFindFirstFile()/FindNextFile()函数。他们给出了同样的结果。 考虑下面的程序。它读取测试目录中的文件(以POSIX和winapi的方式)并打印出来 #include <stdio.h> #inc

我必须指出,目前为windows平台开发代码对我来说是个谜

我在浏览目录和读取存在波兰字符的文件时遇到问题。以下代码片段在英语和波兰语版本的windows上工作,但不是德语版本。原因是什么?我已经尝试过POSIX
opendir()
/
readdir()
和winapi
FindFirstFile()
/
FindNextFile()
函数。他们给出了同样的结果。
考虑下面的程序。它读取测试目录中的文件(以POSIX和winapi的方式)并打印出来

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <dirent.h>

int main(void)
{
    char* name;
    name = _getcwd(NULL, 0);

    char* tmp = realloc(name, strlen(name)*2);
    if (tmp != NULL) {
        name = tmp;
    }
    else {
        perror("realloc");
        free(name);
        exit(1);
    }

    strcat(name, "\\test");
    DIR* dir = opendir(name);
    struct dirent* s;
    while ((s = readdir(dir)) != NULL) {
        printf("%s\n", s->d_name);
    }
    closedir(dir);
    free(s);

    strcat(name, "\\*");
    HANDLE dir_w;
    WIN32_FIND_DATA s_w;
    if ((dir_w = FindFirstFile(name, &s_w)) != INVALID_HANDLE_VALUE) {
        while (FindNextFile(dir_w, &s_w) != 0) {
            printf("%s\n", s_w.cFileName);
        }
    }
    FindClose(dir_w);

    free(name);

    return 0;
}
#包括
#包括
#包括
#包括
内部主(空)
{
字符*名称;
name=_getcwd(NULL,0);
char*tmp=realloc(名称,strlen(名称)*2);
如果(tmp!=NULL){
名称=tmp;
}
否则{
perror(“realloc”);
免费(姓名);
出口(1);
}
strcat(名称“\\test”);
DIR*DIR=opendir(名称);
结构方向*s;
而((s=readdir(dir))!=NULL){
printf(“%s\n”,s->d_名称);
}
closedir(dir);
免费的;
strcat(名称“\\*”);
处理方向;
WIN32_FIND_DATA s_w;
if((dir\u w=FindFirstFile(name,&s\u w))!=无效的\u句柄\u值){
while(FindNextFile(dir\u w和s\u w)!=0){
printf(“%s\n”,s_w.cFileName);
}
}
FindClose(dir_w);
免费(姓名);
返回0;
}
问题:在使用德语的windows上,波兰语字符被解释为ASCII字符。例如,如果文件名为:

ąęćś.txt

然后,在英语窗口中,它被正确读取,但在德语窗口中,它被读取为

aecs.txt

但这样的文件并不存在。我是否应该使用它特定的类型和功能(FindNextFilew)?我没有德语窗口,因此很难重现错误。我一直在尝试使用命令
chcp1250
更改代码页,但没有任何帮助。将locale设置为pl也没有帮助


编译器:gcc 5.0.0

您调用的C标准库函数将使用ANSI编码的文本,我相信您知道它无法处理国际文本


因此,您需要使用本机Unicode Windows API,而不是传统的ANSI版本。这意味着基于
wchar\u t
的函数具有
W
前缀,如
FindFirstFileW
。首先,您应该启用Unicode条件,以便
FindFirstFile
宏扩展到
FindFirstFile

也许可以尝试编译Unicode?此外,请注意函数可以读取的内容(
FindFirstFileW
可以读取包含任何内容的文件名)与控制台可以显示的内容之间存在差异。控制台当前代码页无法显示的字符将被转换,但名称可以正确写入GUI元素(例如,您可以使用
MessageBoxW
)或正确写入二进制文件(如果您自己进行编码)。