Can';t使用CLion打开文件名中包含unicode字符的文件

Can';t使用CLion打开文件名中包含unicode字符的文件,c,winapi,unicode,clion,C,Winapi,Unicode,Clion,打开名称中包含Unicode字符的文件时遇到问题。 我在桌面上创建了一个只有几行文本的文件 c:\users\james\desktop\你好世界.文本 编辑:我正在使用CLion。CLion正在用unicode传递参数 当我将该字符串放入Windows运行对话框时,它会找到该文件并打开它 不过,有趣的是,我通过调用CommandLineToArgvW: L“c:\\\\users\\\\james\\\\desktop\\\\你好世界.txt“ 因此,我编写了一个小例程,将文件名复制到另一个w

打开名称中包含Unicode字符的文件时遇到问题。 我在桌面上创建了一个只有几行文本的文件

c:\users\james\desktop\你好世界.文本

编辑:我正在使用CLion。CLion正在用unicode传递参数

当我将该字符串放入Windows运行对话框时,它会找到该文件并打开它

不过,有趣的是,我通过调用CommandLineToArgvW:
L“c:\\\\users\\\\james\\\\desktop\\\\你好世界.txt“

因此,我编写了一个小例程,将文件名复制到另一个
wchar\u t*
并去掉斜杠。还是不行

errno==2
f==NULL

size_t filename_max_len = wcslen(filename);

//strip double slashes
wchar_t proper_filename[MAX_PATH + 1];

wchar_t previous = L'\0';
size_t proper_filename_location = 0;

for(int x = 0; x < filename_max_len; ++x)
{
    if(previous == L'\\' && filename[x] == L'\\')
        continue;

    previous = filename[x];
    proper_filename[proper_filename_location++] = filename[x];
}

proper_filename[proper_filename_location] = L'\0';

//Read in binary mode to prevent the C system from screwing with line endings
FILE *f = _wfopen(proper_filename, L"rb");

int le = errno;

if (f == NULL)
{
    perror(strerror(le));

    if(le == ERROR_FILE_NOT_FOUND)
    {
        return DUST_ERR_FILE_NOT_FOUND;
    }
    else {
        return DUST_ERR_COULD_NOT_OPEN_FILE;
    }
}
size\u t filename\u max\u len=wcslen(文件名);
//带双斜杠
wchar_t正确的文件名[最大路径+1];
wchar_t previous=L'\0';
大小\u t正确\u文件名\u位置=0;
对于(int x=0;x
我已经解决了这个问题。我的直觉是正确的。CLion似乎提供unicode作为程序的输入。使用Windows run对话框并将其作为参数传递给我的程序,我能够毫无问题地打开和处理该文件。

我的第一个猜测是228、189、160代表文件名的第一个字符,编码为UTF-8字节序列,因为我觉得它像这样的序列。E4 BD A0(228、189、160)解码为U+4F60,这实际上是对应于第一个字符的Unicode码点

我在中修改了
main
的输出部分,将每个参数打印为十六进制编码的字节序列。我复制并粘贴了您的路径作为程序的参数,汉字在UTF-8中编码为:

E4 BD A0
E5 A5 BD
E4 B8 96
E7 95 8C
您的评论中提到的数字略有不同(特别是8211/U+2013、8226/U+2022和338/U+0152)。查看代码页Windows 1250和Windows 1252,两个代码页中的字节0x96、0x95和0x8C分别与U+2013、U+2022和U+0152完全对应。我猜当您的原始程序遇到Unicode输入时,它会在某个地方出错(您正在使用
GetCommandLineW
并将其传递给
CommandLineToArgvW
,对吗?)

这是我编辑的输出屏幕截图,用于突出显示相关字符序列(
¥
标志符号是
\
标志符号,但我用于cmd.exe):


实际上,错误号=2。我想这意味着找不到文件。如果
errno
不是
0
,请查看
strerror()
所说的内容。调试程序经常将反斜杠加倍,使字符串看起来像C文字字符串。也许这就是发生的事?但是我在这里看到你的代码没有什么不好的地方,所以显示创建“filename”的代码。在Windows上它们被忽略了<代码>c:\\\\\\\\\\\\\\\\\\\\\\\/code>与
c:\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/code>相同,杰克更好,没有malloc或免费<代码>wchar_t正确的文件名[文件名\u最大长度+1]是的。我发现CLion调试参数是用unicode完成的。我向CLion提交了一个bug,他们已经接受并分配了这个问题。