raku 可以避免这个 Malformed UTF-8 错误吗?

2024-05-16

当我运行这个 raku 脚本时......

my $proc = run( 'tree', '--du', :out);
$proc.out.slurp(:close).say;

我在 MacOS 上遇到此错误...

Malformed UTF-8 near bytes ef b9 5c

...而不是这样的东西treezsh 的输出这就是我想要的......

.
├── 00158825_20210222_0844.csv
├── 1970-Article\ Text-1971-1-2-20210118.docx
├── 1976-Article\ Text-1985-1-2-20210127.docx
├── 2042-Article\ Text-2074-1-10-20210208.pdf
├── 2045-Article\ Text-2076-1-10-20210208.pdf
├── 6.\ Guarantor\ Form\ (A).pdf

我努力了slurp(:close, enc=>'utf8-c8')并且错误是相同的。

我也尝试过...

 shell( "tree --du >> .temp.txt" );
 my @lines = open(".temp.txt").lines;
 dd @lines;

...并且错误是相同的。

打开 .temp.txt 揭示了这一点......

.
â<94><9c>â<94><80>â<94><80> [    1016739]  True  
â<94><9c>â<94><80>â<94><80> [ 9459042241]  dir-name
â<94><82>   â<94><9c>â<94><80>â<94><80> [     188142]  Business
â<94><82>   â<94><82>   â<94><9c>â<94><80>â<94><80> [       9117]  KeyDates.xlsx
â<94><82>   â<94><82>   â<94><9c>â<94><80>â<94><80> [      13807]  MondayNotes.docx

文件-我给出这个...

.temp.txt: text/plain; charset=unknown-8bit

有什么建议吗?

[这是Catalina 10.15.17,终端编码Unicode(UTF-8) 欢迎来到????????????????????????™ v2020.10。 实施????????????????™ 编程语言 v6.d。 基于 MoarVM 版本 2020.10 构建。]


您的代码页/区域设置似乎不是 Utf8。 (或者tree忽略代码页并使用不同的东西。)

快速……从中得到一些东西,任何东西;就是使用8位单字节编码。

run( 'tree', '--du', :out, :enc<latin1> );

一般来说,查看 Utf8 解码在哪里开始出错就足够了。


也就是说,让我们看看您的预期输出和文件输出。

say '├──'.encode; # utf8:0x<E2 94 9C E2 94 80 E2 94 80>

在你的文件中有

â<94><9c>â<94><80>â<94><80> [    1016739]  True

Wait …

say 'â'.encode('latin1'); # Blob[uint8]:0x<E2>
<E2><94><9c><E2><94><80><E2><94><80>

       <E2 94 9c E2 94 80 E2 94 80>

utf8:0x<E2 94 9C E2 94 80 E2 94 80>

是的,它们看起来非常相似。
因为它们是完全相同的。

因此,它似乎确实在某种程度上产生了预期的产出。

这似乎证实了,是的,中间存在编码问题tree和你的代码。这表明代码页/区域设置设置错误。


您还没有真正提供足够的信息来准确找出问题出在哪里。 你应该用过run以二进制模式为我们提供准确的输出。

say run('echo', 'hello', :out, :bin).out.slurp;
# Buf[uint8]:0x<68 65 6C 6C 6F 0A>

你也没说如果<9c>在文件中实际上是四个文本字符,或者它是您用来打开文件将二进制数据转换为文本的任何功能的功能。

如果所有示例数据都是相同的,那就太好了。


稍微相关的说明......

Since tree给出文件名,并且文件名不是 Unicode, using utf8-c8放在这里是合适的。
(用户名和密码通常也是如此。)

这是我在计算机上运行的一些代码,希望能说明原因。

say dir(:test(/^ r.+sum.+ $/)).map: *.relative.encode('utf8-c8').decode
# (résumé résumé résumé résumé)

dir(:test(/^ r.+sum.+ $/)).map: *.relative.encode('utf8-c8').say
# Blob[uint8]:0x<72 65 CC 81 73 75 6D 65 CC 81>
# Blob[uint8]:0x<72 C3 A9 73 75 6D 65 CC 81>
# Blob[uint8]:0x<72 C3 A9 73 75 6D C3 A9>
# Blob[uint8]:0x<72 65 CC 81 73 75 6D C3 A9>

say 'é'.NFC;
# NFC:0x<00e9>
say 'é'.NFD
# NFD:0x<0065 0301>

sub to-Utf8 ( Uni:D $_ ){
   .map: *.chr.encode
}

say to-Utf8 'é'.NFC
# (utf8:0x<C3 A9>)
say to-Utf8 'é'.NFD
# (utf8:0x<65> utf8:0x<CC 81>)

So é要么被编码为一个组合代码点<C3 A9>或两个分解的代码点<65> <CC 81>.

我真的只是为了这个目的创建了 4 个“同名”文件吗?
是的。是的,我做到了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

raku 可以避免这个 Malformed UTF-8 错误吗? 的相关文章

随机推荐