簡體   English   中英

Linux中帶有擴展字符(128-255)的open()函數返回-1錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM