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

标签 io character-encoding raku rakudo

如何从外部文件中读取特殊字符?这里有一个简单的.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 script, input file in notepad++, exec in cmd.exe

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

最佳答案

如果您使用的不是 Windows
此 SO 与您完全或几乎完全无关。
如果您使用的是 Windows 10
检查 "Beta: Use Unicode UTF-8 for worldwide language support" option复选框。
至少在我最初编写此答案时,此 Unicode 相关复选框附近的文本声称它适用于不支持 Unicode 的程序,但您应该忽略它。 [1]
在我最初写这个答案时,复选框位于控制面板、“区域”条目、“管理”选项卡、“更改系统区域设置”按钮下。
自从我写下这个答案以来,Microsoft 可能已经更改了这些内容,并且可能会再次更改它,例如通过移动和/或重命名复选框,或者使事情比单击单个复选框更复杂。
根据他们在此答案下方的评论,OP 指出:

For those who are interested in that particular option, it can be found in the "legacy" Control panel of windows -> Region -> Administrative -> Edit settings...


如果您使用的是旧版本的 Windows
可以说,好消息是 Raku 和 Rakudo 拥有一些世界上最好的现代 Unicode 支持,好消息是它依赖于 Microsoft 正确支持 Unicode,而他们现在正在尝试这样做。
坏消息是,他们在旧版本的 Windows 中犯了很多错误(甚至在他们现在正试图修复的 Windows 10 中),因此任何解决方案都将受到这些错误的限制。 (也许最大的问题是微软在 [1] 主题上的双重发言,但我们希望我们能解决这个问题。)
话虽如此,请阅读以下内容,然后返回寻找解决方案或发布新的 SO 问题,我们将尽力提供帮助。

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

they are still in 2018 improving their operating system support for UTF-8


微软在上个世纪的 Unicode 支持上走错了路。好消息是,他们终于开始从他们为自己和其他人挖的洞中挖出出路。
但他们肯定还没有——在最初写这个答案的时候不是,而且,我怀疑再过 N 年都不会——至少因为对于许多最终用户来说,开箱即用的东西不能正常工作。我认为这是 Windows 上大多数 Unicode 问题的根源。
像 Python、Ruby 和 Perl 等较旧的语言提出了一系列技巧,通过使用 Microsoft 讽刺性地描述为“Unicode 支持”的简单场景,向大多数用户隐藏了 Microsoft 较旧的 UTF8 支持的许多问题。
这总是伴随着权衡,即对于世界各地的许多地方的更复杂的应用程序来说,事情变得非常麻烦甚至完全不可行。 (以至于即使是强大的微软也终于在 2018 年投降了。)
从本质上讲,在 Microsoft 为该程序做出新的努力之前,在 Windows 上运行的软件别无选择,只能使用其根本性损坏的“Unicode 支持”或实际正确支持 Unicode。 [1]
Raku 和 Rakudo 专注于后者,它在 Windows 上运行时出现的问题与这与微软旧的破坏方法相冲突有关。幸运的是,Microsoft 现在正在使用该程序,因此如果您有耐心,我们可能会找到一种方法来解决您在 Windows 上使用 Unicode 时遇到的问题。
特别是,如果您使用的是较旧的 Windows 版本,除非您很幸运,否则请期待它最初无法与现代 Unicode 识别软件一起使用。如果可以,我们仍然会提供帮助,但这可能需要您对我们、Microsoft 和 Rakudo 保持耐心,反之亦然。
脚注
[1] 在我最初写这个答案的时候,复选框附近有一个文本,它用于不支持 Unicode 的程序。这与实际情况完全相反,但嘿,是微软。

关于io - Perl6 (Rakudo) - 如何处理文件中的特殊字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55179824/

相关文章:

java - 直接从字节数组播放声音 - Java

Java:字符串的字符(以字节为单位)的值是常量吗?

raku - 在 rakudo perl6 中使用语法时遇到问题

concurrency - 当线程太少时,程序挂起

equation - 在 Raku 中求解指数方程

c# - 异常处理问题

c++ - C 文件* 到 ostream/istream

io - 有没有办法使用名单 I/O 功能来读取具有可分配组件的派生类型?

javascript - 二进制和utf8有什么区别?

unicode - F# - 卡片套装未显示在控制台中