代码之家  ›  专栏  ›  技术社区  ›  Damn Vegetables

Linux setxattr:可以使用unicode字符串吗?

  •  0
  • Damn Vegetables  · 技术社区  · 4 年前

    我在VS代码中编写了以下代码,并运行它来设置文件属性。它似乎已成功运行,但当我检查该值时,文本不正确。文件扩展属性是否支持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=
    
    0 回复  |  直到 4 年前
        1
  •  1
  •   phuclv    4 年前

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

    user.dog=0s44Gt44GT
    

    那是因为 -d 不知道数据的格式,只是将其作为二进制文件转储。这个 0s 前缀表示数据在base64中,如 manpage :

    • -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="ねこ"
    
    推荐文章