Linux中带有扩展字符(128-255)的open()函数返回-1错误

时间:2017-10-20 12:42:35

标签: c++ c linux

当我尝试使用open()函数在LINUX中创建文件时,对于包含扩展字符的文件名(例如:Björk.txt),我收到错误' - 1'。此处文件包含特殊字符ö(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错误?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

Linux中的文件名通常以UTF-8指定,而不是CP437。 open失败,因为您传递的文件名与操作系统中的文件名不匹配。

请尝试打开此文件:/home/user188/Output/Bj\xc3\xb6rk.txt。这是以UTF-8编码为两个字节的特殊字符。