Can';t使用CLion打开文件名中包含unicode字符的文件
打开名称中包含Unicode字符的文件时遇到问题。 我在桌面上创建了一个只有几行文本的文件 c:\users\james\desktop\你好世界.文本 编辑:我正在使用CLion。CLion正在用unicode传递参数 当我将该字符串放入Windows运行对话框时,它会找到该文件并打开它 不过,有趣的是,我通过调用CommandLineToArgvW: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
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,他们已经接受并分配了这个问题。