Raku 是否有快速查找 remove/replace 非 ASCII 或格式错误的 utf8 字符的方法?
Raku Is there a fast method to find and remove/replace non-ASCII or malformed utf8 characters?
我经常遇到格式错误的 utf-8 字符,这些字符会破坏我的代码。我在 Whosebug 上阅读了一些(不是全部)相关的 questions/answers,但没有特定于 Raku/perl6。有没有一种快速的方法可以从字符串中删除这些讨厌的字符? “https://docs.raku.org/language/regexes#Predefined_character_classes”中的预定义字符 classes 只是不会这样做:
示例:来自 REPL:
> say "â " ~~ /\w/ # you have to have a space following the "a" with "^" for it to work
「â」
> say "�" ~~ /\w/ # without the space, the character doesn't look normal
Malformed UTF-8 at line 1 col 6
> say "â ".chars # looks like 2 chars, but it says 1 char
1
> say "â ".comb.[0] # strange, the pesky char makes the space precede the cursor as I type
â
> say "â".comb.[0 ] # strange, the pesky char makes the space precede the cursor as I type
â
> say "â".comb.[0] # there is a space following ']' or it won't work
â
> say "â".comb.[0 ] # very strange, must have space before ']'
â
> say "â".comb
(â)
> say "â".comb.[0] .ord # # same here, very strange, it makes space precede the cursor
226
> my $a = Buf.new(226)
Buf:0x<E2>
> say $a.decode
Malformed termination of UTF-8 string
in block <unit> at <unknown file> line 1
> say $a.decode('utf8-c8')
xE2
> for @$a { say $_.chr; }
â
> say (@$a).elems
1
> say "â " ~~ / <alpha> / # again, must have space in the quote
「â」
alpha => 「â」
> say "â " ~~ / <cntrl> /
Nil
这个很麻烦。如何删除这些非 utf8 字符?是否有预定义字符 class 用于所有良好的 utf-8 字符或作为模范公民的良好 ASCII 字符?
希望有人能给出更好的答案。同时...
在你的问题中有几件非常不同的事情。
Is there a fast method to find and remove/replace non-ASCII or malformed utf8 characters?
应该有一个很好的、明显的、相当简单的:
say .decode: replacement => '�'
given $buf-that's-supposed-to-be-utf8
这个 应该 以与普通 slurp
相同的方式解码,除了遇到 "Malformed UTF-8" 时不只是放弃解码,它应该只用您指定的替换字符替换格式错误的数据,并尽可能继续。
不幸的是(据我所知)由于 rakudo/moarvm 中的错误,这不起作用,如我对 的回答所述。
我在写那个 SO 时没有提出问题。您的新 SO 提示我提交两个错误报告:
.decode
's replacement
option didn't work in Rakudo v2019.03.01 and presumably still doesn't #3509
decoder replacement options didn't work in Rakudo v2019.03.01 and presumably still don't #1245
的答案中给出了一些其他选项。
我在您尝试过的 repl 示例中看到 .decode('utf8-c8')
。这可能是您目前在 raku 中的最佳选择。
如果上述 none 有帮助,我认为您现在无法使用外部工具在文件到达 raku 之前对其进行预处理。
Is there a predefined character class for all good utf-8 chars
utf8 数据是不是 个字符。它只是字节。数据 encodes 个字符,或者至少应该如此,但是保持 encodings 和 characters 在脑海中分开。
如果您知道老式电报的工作原理,就是这样。字符中有一条消息。然后 morse code 用于传输它。它们是非常不同的东西。
当您看到 "Malformed UTF-8" 或类似内容时,这意味着解码器在数据的某些部分(字节)上阻塞。他们对它作为角色毫无意义。就像不遵守莫尔斯电码规则的莫尔斯电码
这样的数据往好里说是令人困惑的废话,往坏里说是危险的废话。 Unicode 标准要求在您可以用它做 任何事情 之前完全消除它。
显而易见的友好解决方案是用您要求的用户指定的替换字符替换废话。相反,正则表达式字符 class 既是错误的工具又为时已晚。
示例:来自 REPL
这又是一个完整的蜡球。
有:
您的(您的)本地系统上的终端使用的编码;
当您使用本地系统时,渲染您看到的字符,以及光标的指示;
当您从 repl 显示复制时,您的 cut/paste 缓冲区中有什么;
当您粘贴到 SO 问题的编辑 window 时,您的浏览器对该缓冲区做了什么;
当您单击 Post 您的问题 按钮以及何时所以呈现你的问题;
当我看你的SO问题时,my本地系统、浏览器、终端、cut/paste缓冲区等在做什么;
等
即使我们的系统以及您和我都在做我们应该做的事情,这种复杂性仍然存在。所以,当然,光标和其他问题 某些东西 有问题,但我不会尝试用这个答案来确定它,因为与我在上面回答的问题的第一部分不同, 这与 raku/do.
没有关系
我正在尝试确定您遇到的问题是由于 REPL 还是其他一些因素造成的。这是来自您输入代码的要点 link:
https://gist.github.com/jubilatious1/b99def4cb2d02e6cef5c15b3fd102447
我删除了双引号内的空格以强制出错(如果有的话)。我在注释(如果有的话)之前的每个代码行的末尾插入了一个分号。我将一个有问题的行 say $a.decode;
移到了最后。然后我用一个相当新的 Rakudo 版本测试了要点:
~$ raku --version
Welcome to ™ v2020.10.
Implementing the ™ programming language v6.d.
Built on MoarVM version 2020.10.
这是我看到的输出:
~$ raku lisprogtor_unicode_SO.p6
「â」
Nil
1
â
â
â
â
(â)
226
xE2
â
1
「â」
alpha => 「â」
Nil
----
Malformed termination of UTF-8 string
in block <unit> at lisprogtor_unicode_SO.p6 line 36
我想知道这是否意味着您遇到的 some/many 个 Unicode 错误要么是 1) 局限于 REPL,要么 2) 自您首次发布以来已得到解决?
HTH.
(2020 年 11 月 24 日更新)。
我经常遇到格式错误的 utf-8 字符,这些字符会破坏我的代码。我在 Whosebug 上阅读了一些(不是全部)相关的 questions/answers,但没有特定于 Raku/perl6。有没有一种快速的方法可以从字符串中删除这些讨厌的字符? “https://docs.raku.org/language/regexes#Predefined_character_classes”中的预定义字符 classes 只是不会这样做:
示例:来自 REPL:
> say "â " ~~ /\w/ # you have to have a space following the "a" with "^" for it to work
「â」
> say "�" ~~ /\w/ # without the space, the character doesn't look normal
Malformed UTF-8 at line 1 col 6
> say "â ".chars # looks like 2 chars, but it says 1 char
1
> say "â ".comb.[0] # strange, the pesky char makes the space precede the cursor as I type
â
> say "â".comb.[0 ] # strange, the pesky char makes the space precede the cursor as I type
â
> say "â".comb.[0] # there is a space following ']' or it won't work
â
> say "â".comb.[0 ] # very strange, must have space before ']'
â
> say "â".comb
(â)
> say "â".comb.[0] .ord # # same here, very strange, it makes space precede the cursor
226
> my $a = Buf.new(226)
Buf:0x<E2>
> say $a.decode
Malformed termination of UTF-8 string
in block <unit> at <unknown file> line 1
> say $a.decode('utf8-c8')
xE2
> for @$a { say $_.chr; }
â
> say (@$a).elems
1
> say "â " ~~ / <alpha> / # again, must have space in the quote
「â」
alpha => 「â」
> say "â " ~~ / <cntrl> /
Nil
这个很麻烦。如何删除这些非 utf8 字符?是否有预定义字符 class 用于所有良好的 utf-8 字符或作为模范公民的良好 ASCII 字符?
希望有人能给出更好的答案。同时...
在你的问题中有几件非常不同的事情。
Is there a fast method to find and remove/replace non-ASCII or malformed utf8 characters?
应该有一个很好的、明显的、相当简单的:
say .decode: replacement => '�'
given $buf-that's-supposed-to-be-utf8
这个 应该 以与普通 slurp
相同的方式解码,除了遇到 "Malformed UTF-8" 时不只是放弃解码,它应该只用您指定的替换字符替换格式错误的数据,并尽可能继续。
不幸的是(据我所知)由于 rakudo/moarvm 中的错误,这不起作用,如我对
我在写那个 SO 时没有提出问题。您的新 SO 提示我提交两个错误报告:
.decode
'sreplacement
option didn't work in Rakudo v2019.03.01 and presumably still doesn't #3509decoder replacement options didn't work in Rakudo v2019.03.01 and presumably still don't #1245
我在您尝试过的 repl 示例中看到 .decode('utf8-c8')
。这可能是您目前在 raku 中的最佳选择。
如果上述 none 有帮助,我认为您现在无法使用外部工具在文件到达 raku 之前对其进行预处理。
Is there a predefined character class for all good utf-8 chars
utf8 数据是不是 个字符。它只是字节。数据 encodes 个字符,或者至少应该如此,但是保持 encodings 和 characters 在脑海中分开。
如果您知道老式电报的工作原理,就是这样。字符中有一条消息。然后 morse code 用于传输它。它们是非常不同的东西。
当您看到 "Malformed UTF-8" 或类似内容时,这意味着解码器在数据的某些部分(字节)上阻塞。他们对它作为角色毫无意义。就像不遵守莫尔斯电码规则的莫尔斯电码
这样的数据往好里说是令人困惑的废话,往坏里说是危险的废话。 Unicode 标准要求在您可以用它做 任何事情 之前完全消除它。
显而易见的友好解决方案是用您要求的用户指定的替换字符替换废话。相反,正则表达式字符 class 既是错误的工具又为时已晚。
示例:来自 REPL
这又是一个完整的蜡球。
有:
您的(您的)本地系统上的终端使用的编码;
当您使用本地系统时,渲染您看到的字符,以及光标的指示;
当您从 repl 显示复制时,您的 cut/paste 缓冲区中有什么;
当您粘贴到 SO 问题的编辑 window 时,您的浏览器对该缓冲区做了什么;
当您单击 Post 您的问题 按钮以及何时所以呈现你的问题;
当我看你的SO问题时,my本地系统、浏览器、终端、cut/paste缓冲区等在做什么;
等
即使我们的系统以及您和我都在做我们应该做的事情,这种复杂性仍然存在。所以,当然,光标和其他问题 某些东西 有问题,但我不会尝试用这个答案来确定它,因为与我在上面回答的问题的第一部分不同, 这与 raku/do.
没有关系我正在尝试确定您遇到的问题是由于 REPL 还是其他一些因素造成的。这是来自您输入代码的要点 link:
https://gist.github.com/jubilatious1/b99def4cb2d02e6cef5c15b3fd102447
我删除了双引号内的空格以强制出错(如果有的话)。我在注释(如果有的话)之前的每个代码行的末尾插入了一个分号。我将一个有问题的行 say $a.decode;
移到了最后。然后我用一个相当新的 Rakudo 版本测试了要点:
~$ raku --version
Welcome to ™ v2020.10.
Implementing the ™ programming language v6.d.
Built on MoarVM version 2020.10.
这是我看到的输出:
~$ raku lisprogtor_unicode_SO.p6
「â」
Nil
1
â
â
â
â
(â)
226
xE2
â
1
「â」
alpha => 「â」
Nil
----
Malformed termination of UTF-8 string
in block <unit> at lisprogtor_unicode_SO.p6 line 36
我想知道这是否意味着您遇到的 some/many 个 Unicode 错误要么是 1) 局限于 REPL,要么 2) 自您首次发布以来已得到解决?
HTH.
(2020 年 11 月 24 日更新)。