为什么读取文件句柄时“utf8-c8”编码不起作用

Rob*_*ade 9 raku

我希望读取不会解码为有效 UTF-8 的字节序列,特别是与高和低代理代码点相对应的字节序列。结果应该是一个 raku 字符串。

\n

读到,在 raku 中,\'utf8-c8\' 编码可用于此目的。

\n

考虑代码点U+D83F。它是高代理项(为 UTF-16 代理项对的高半部分保留)。

\n

如果编码为 UTF-8,U+D83F 的字节序列为 0xED 0xA0 0xBF。

\n

吞咽文件?作品

\n

如果我使用“utf8-c8”作为编码来读取包含此字节序列的文件,我会得到预期的结果:

\n
echo -n $\'\\ud83f\' >testfile # Create a test file containing the byte sequence\n
Run Code Online (Sandbox Code Playgroud)\n

myprog1.raku:

\n
#!/usr/local/bin/raku\n$*OUT.encoding(\'utf8-c8\');\nprint slurp(\'testfile\', enc => \'utf8-c8\');\n
Run Code Online (Sandbox Code Playgroud)\n
$ ./myprog1.raku | od -An -tx1\n ed a0 bf\n
Run Code Online (Sandbox Code Playgroud)\n

\xe2\x9c\x94\xef\xb8\x8f 预期结果

\n

吞咽文件句柄?不起作用

\n

但是,如果我从读取文件路径切换到读取文件句柄,即使我将文件句柄的编码设置为“utf8-c8”,它也不起作用:

\n

myprog2.raku

\n
#!/usr/local/bin/raku\n$*OUT.encoding(\'utf8-c8\');\nmy $fh = open "testfile", :r, :enc(\'utf8-c8\');\nprint slurp($fh, enc => \'utf8-c8\');\n#print $fh.slurp; # I tried this too: same error\n
Run Code Online (Sandbox Code Playgroud)\n
$ ./myprog2.raku\nError encoding UTF-8 string: could not encode Unicode Surrogate codepoint 55359 (0xD83F)\n  in block <unit> at ./myprog2.raku line 4\n
Run Code Online (Sandbox Code Playgroud)\n

环境

\n

编辑 2022-10-30:我最初使用我的发行版的软件包(Fedora Linux 36:Rakudo 版本 2020.07)。我刚刚下载了最新的 Rakudo 二进制版本 (2022.07-01)。结果是一样的。

\n
$ /usr/local/bin/raku --version\nWelcome to Rakudo\xe2\x84\xa2 v2022.07.\nImplementing the Raku\xc2\xae Programming Language v6.d.\nBuilt on MoarVM version 2022.07.\n
Run Code Online (Sandbox Code Playgroud)\n
$ uname -a\nLinux hx90 5.19.16-200.fc36.x86_64 #1 SMP PREEMPT_DYNAMIC Sun Oct 16 22:50:04 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux\n
Run Code Online (Sandbox Code Playgroud)\n
$ lsb_release -a\nLSB Version:    :core-4.1-amd64:core-4.1-noarch\nDistributor ID: Fedora\nDescription:    Fedora release 36 (Thirty Six)\nRelease:        36\nCodename:       ThirtySix\n
Run Code Online (Sandbox Code Playgroud)\n