我希望读取不会解码为有效 UTF-8 的字节序列,特别是与高和低代理代码点相对应的字节序列。结果应该是一个 raku 字符串。
\n我读到,在 raku 中,\'utf8-c8\' 编码可用于此目的。
\n考虑代码点U+D83F。它是高代理项(为 UTF-16 代理项对的高半部分保留)。
\n如果编码为 UTF-8,U+D83F 的字节序列为 0xED 0xA0 0xBF。
\n如果我使用“utf8-c8”作为编码来读取包含此字节序列的文件,我会得到预期的结果:
\necho -n $\'\\ud83f\' >testfile # Create a test file containing the byte sequence\nRun Code Online (Sandbox Code Playgroud)\nmyprog1.raku:
\n#!/usr/local/bin/raku\n$*OUT.encoding(\'utf8-c8\');\nprint slurp(\'testfile\', enc => \'utf8-c8\');\nRun Code Online (Sandbox Code Playgroud)\n$ ./myprog1.raku | od -An -tx1\n ed a0 bf\nRun Code Online (Sandbox Code Playgroud)\n\xe2\x9c\x94\xef\xb8\x8f 预期结果
\n但是,如果我从读取文件路径切换到读取文件句柄,即使我将文件句柄的编码设置为“utf8-c8”,它也不起作用:
\nmyprog2.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\nRun 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\nRun Code Online (Sandbox Code Playgroud)\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.\nRun 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\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
208 次 |
| 最近记录: |