[英]open() function in Linux with extended characters (128-255) returns -1 error
当我尝试使用open()函数在LINUX中创建文件时,对于包含扩展字符的文件名,我得到一个错误“ -1” (例如:Björk.txt)。 此处文件包含特殊字符ö (ASCII 148)
我正在使用以下代码:
char* szUnixPath
/home/user188/Output/Björk.txt
open(szUnixPath, locStyle, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
我总是收到-1错误,并且没有创建文件。
当操作系统遇到ASCII 148时,会引发错误。
如果我使用波浪号〜(ASCII 126,例如:Bj〜rk.txt)或低于ASCII值128的任何其他字符,则相同的功能可以很好地工作。
有人可以解释为什么仅对于文件名具有介于128-255之间的特殊字符的我为什么会出现-1错误吗?
我建议您尝试一下一下该名称包含的字节。
在目录中创建文件,然后运行以下简单的C程序:
#include <dirent.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
/* Open directory */
DIR * currdir = opendir(".");
/* Iterate over files */
struct dirent * directory_entry = NULL;
while (NULL != (directory_entry = readdir(currdir)))
{
char * entry_name = directory_entry->d_name;
printf("Directory entry: %s\n", entry_name);
printf("Name bytes (len: %d):\n", strlen(entry_name));
for (size_t i = 0; i < strlen(entry_name); ++i)
{
printf("\tname[%d] = %d\n", i, entry_name[i]);
}
}
return 0;
}
我们可以在输出中轻松地看到“Björk”的长度为6个字节。 我们可以看到这些字节值:
Directory entry: Björk
Name bytes (len: 6):
name[0] = 66
name[1] = 106
name[2] = -61
name[3] = -74
name[4] = 114
name[5] = 107
Linux中的文件名通常在UTF-8中指定,而不是在CP437中指定。 open
失败,因为您传递的文件名与操作系统中的文件名不匹配。
尝试打开此文件:/ /home/user188/Output/Bj\\xc3\\xb6rk.txt
。 这是UTF-8中编码为两个字节的特殊字符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.