0

我在 VS Code 中编写了以下代码并运行它来设置文件属性。它似乎已经成功运行,但是当我检查值时,文本不正确。文件扩展属性是否支持 Unicode 字符串?如果是这样,我该如何修复下面的代码?

#include <stdio.h>
#include <sys/xattr.h>

int main()
{
    printf("ねこ\n");
    ssize_t res = setxattr("/mnt/cat/test.txt", "user.dog"
    , "ねこ", 2, 0); /*also tested 4 and 8*/
    printf("Result = %lu\n", (unsigned long)res);
    return 0;    
}

程序输出

ねこ
Result = 0

读取属性

$ getfattr test.txt  -d
# file: test.txt
user.dog=0s44E=
4

1 回答 1

1

显然ねこ不能存储在 2 个字节中。字符是 U+306D 和 U+3053,以 UTF-8 编码,E3 81 AD E3 81 93因此长度必须设置为 6。如果你这样做了,你会看到getfattr test.txt -d输出

user.dog=0s44Gt44GT

那是因为-d不是数据的格式,而是将其转储为二进制文件。0s前缀表示数据位于手册中所述的base64 格式:

  • -d,--dump

    • 转储所有匹配的扩展属性的值。
  • -e en,--encoding=en

    • 检索值后对其进行编码。en 的有效值为“text”、“hex”和“base64”。编码为文本字符串的值用双引号 (") 括起来,而编码为十六进制和 base64 的字符串分别以 0x 和 0s 为前缀

只需插入44Gt44GT任何 base64 解码器或运行echo 44Gt44GT | base64 --decode,您就会看到打印出正确的字符串。要直接查看字符串,getfattr您需要指定格式-e text

$ getfattr -n user.dog -e text test.txt
# file: test.txt
user.dog="ねこ"
于 2020-10-22T09:51:47.437 回答