Perl6(Rakudo)- 如何处理来自文件的特殊字符?

6
我该如何从外部文件读取特殊字符?这里有一个简单的法语.txt文件,其内容是https://fr.lipsum.com/的第一段:正如您在我的屏幕截图中看到的那样,该文件编码为UTF-8,但重音符号未正确显示。
我尝试了各种编码,在notepad++和perl6脚本中,例如:
enc => "utf8"
enc => "latin1"

使用Python或Ruby脚本,我没有遇到这个问题。关于这个问题,我没有找到任何精确的例子,可能是因为Perl 6还比较新(??)。谢谢。

如下截图中所示,这是我的脚本:

my $text_contents = slurp "testfile.txt", enc => "utf8";
say $text_contents;
prompt;

Perl6脚本,notepad++中的输入文件,在cmd.exe中执行


最终编辑:解决方案是启用一个选项,该选项在Windows 10 1803中以beta状态可用,使操作系统正确处理unicode字符:请参见下面的答案和评论...


请提供.txt文件的编码(如屏幕截图所示),并在问题中作为文本提供.txt文件的片段(而不是图像)。您还应该以文本形式发布Perl 6脚本,这将帮助我们进行复制和粘贴以尝试复现您的行为。谢谢! - Håkon Hægland
1
默认情况下,slurp 读取的是 UTF-8 编码(从截图来看,您的文件也是这种编码)。如果您在 perl6 中直接创建一个 UTF8 字符并输出它,会发生什么呢?例如:perl6 -e 'say "\c[Latin Small Letter A with Acute]"' 如果输出的是 á,则一切正常。否则,问题不在于读取文件,而是您的命令行无法处理 UTF8 输出。不过,我手头没有 Windows 机器可以测试。 - Scimon Proctor
输入命令 type testfile.txt 与 Rakudo 输出相同。 - Frenzowski
1
所以问题就在这里。您的控制台无法正确显示UTF8。https://dev59.com/3XRC5IYBdhLWcg3wK9yV 这个答案可能会有所帮助。 - Scimon Proctor
1
这里的问题在于Windows cmd将单引号视为普通字符。请尝试 perl6 -e "say qq/\c[Latin Small Letter A with Acute]/"。你的机器上有Windows PowerShell吗?我建议在PowerShell上尝试相同的命令,看看是否遇到了相同的问题。(抱歉没有换行,SO的移动站点似乎无法正确输入它们) - Daniel Mita
显示剩余4条评论
1个回答

6

如果您没有使用Windows

这篇文章与您无关或几乎无关。

如果您使用的是Windows 10

检查“Beta: 在全球范围内支持Unicode UTF-8”选项复选框。(点此链接)

至少在我最初撰写答案时发布的文本中,这个与Unicode相关的复选框附近的文字声称它是为不支持Unicode的程序设计的,但您应该将它忽略掉[1]

最初撰写答案时,此复选框位于控制面板,“区域设置”条目,“管理”标签,“更改系统区域设置”按钮下。

自我撰写答案以来,Microsoft 可能已经更新了此选项,并且可能会再次更改它,例如移动和/或重新命名复选框,或使事情变得更加复杂,而不仅仅是单击一个复选框。

根据作者下方的评论:

对于那些有兴趣的人,可以在 Windows 的“传统”控制面板中找到该选项 -> 区域设置 -> 管理 -> 编辑设置...

如果您使用旧版Windows

可以说,好消息是Raku和Rakudo拥有世界上最好的现代Unicode支持之一,而令人满意的消息是它依赖于Microsoft正确地支持Unicode,而他们现在正在努力做到这一点。

坏消息是,在旧版Windows(甚至在他们现在试图修复的Windows 10中)中,他们犯了很多错误,因此任何解决方案都将受到这些错误的限制。(也许最大的问题是Microsoft在该主题上的含糊不清[1],但让我们希望我们可以绕过这个问题。)

总之,请阅读以下内容,然后返回搜索解决方案或发布新的SO问题,我们将尝试提供帮助。


引用维基百科页面Microsoft Windows 中的 Unicode

2018年,他们仍在改进其对UTF-8的操作系统支持

Microsoft在上个世纪的Unicode支持方面走错了路。好消息是,他们终于开始走出他们为自己和其他人挖的坑了。

但他们肯定还没有到达目标——至少在我最初撰写答案时,我怀疑要再过N年——因为对许多终端用户来说,事情并没有正确地工作。我认为这是Windows上大多数Unicode问题的根源。

Python、Ruby和Perl等旧语言通过使用微软所谓的“Unicode支持”来隐藏Microsoft旧版UTF8支持中的许多问题,使大多数用户在简单场景下不受影响。然而,这总是有一个折衷方案,对于全球许多地区的许多复杂应用程序来说,问题变得非常棘手甚至完全无法解决。(如此之多,以至于即使强大的Microsoft最终在2018年也屈服了。)

本质上,在Microsoft的新尝试出现之前,运行于Windows上的软件除了要么使用基本上损坏的“Unicode支持”,要么实际上正确地支持Unicode之外别无选择。[1]

Raku和Rakudo专注于后者,而在Windows上运行时出现问题与此有关,因为它与Microsoft旧的损坏方法相冲突。幸运的是,Microsoft正在跟进,并且我们可能会找到一种方法来解决您在Windows上遇到的Unicode问题,只要您有耐心

特别是,如果您正在使用旧版Windows,请不要指望它可以与现代的Unicode感知软件一起正常工作,除非您很幸运。如果可能的话,我们仍然会提供帮助,但这可能涉及您对我们、Microsoft和Rakudo有耐心,反之亦然。

脚注

[1] 当我最初写下这个答案时,复选框旁边有一段文本表明它是针对不支持Unicode的程序。这完全相反于实际情况,但嘿,这是微软。


我只是出于好奇尝试使用Perl6,而且我承认我有点懒,所以我想等到Perl6与特殊字符的兼容性得到改善之后再尝试。非常感谢您详细的回答! - Frenzowski
嗨@Frenzowski,P6基于Unicode使用,因此它与Unicode兼容良好。我不确定它是否会解决与非Unicode字符相关的问题,我怀疑微软除了在Windows 10中尝试的更改之外,不会做出任何更改。您正在使用Windows 10吗?如果是这样,我希望您不要太懒,没有尝试点击Microsoft提供的选项,并且很想知道发生了什么。如果不是,请告诉我们您使用的Windows版本。感谢您的任何回复。 - raiph
2
嗨 @raiph,你说得没错,我并不懒惰。是的,我使用的是Windows 10,实际上我以为这是下载操作系统的测试版。我太傻了。我刚刚检查了选项,重启了电脑,用 type <filename> 命令可以正常显示UTF-8编码的字符。哈利路亚!对于那些对这个特定选项感兴趣的人,它可以在Windows的“传统”控制面板中找到 -> 区域 -> 管理 -> 编辑设置...谢谢你提醒我注意这个话题。 - Frenzowski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接