如何在 Windows 8 中以 utf10 编码和输出读取文件?

How to read a file in utf8 encoding and output in Windows 10?

提问人:Polar Bear 提问时间:5/29/2021 最后编辑:Polar Bear 更新时间:11/6/2021 访问量:222

问:

在 Windows 8 中读取和输出 utf10 编码数据的正确程序是什么?

我尝试在 Windows 8 中读取 utf10 编码文件并将行输出到终端中,但不会重现某些语言的符号。

  • 操作系统: Windows 10
  • 本机代码页:437
  • 切换代码页:65001

在窗口中发出的命令。以下 ruby 代码读取 utf8 编码文件并输出带有 .cmdchcp 65001puts

fname = 'hello_world.dat'

File.open(fname,'r:UTF-8') do |f|
    puts f.read
end

hello_world.dat内容

Afrikaans:    Hello Wêreld!
Albanian:     Përshendetje Botë!
Amharic:      ሰላም ልዑል!
Arabic:       مرحبا بالعالم!
Armenian:     Բարեւ աշխարհ!
Basque:       Kaixo Mundua!
Belarussian:  Прывітанне Сусвет!
Bengali:      ওহে বিশ্ব!
Bulgarian:    Здравей свят!
Catalan:      Hola món!
Chichewa:     Moni Dziko Lapansi!
Chinese:      你好世界!
Croatian:     Pozdrav svijete!
Czech:        Ahoj světe!
Danish:       Hej Verden!
Dutch:        Hallo Wereld!
English:      Hello World!
Estonian:     Tere maailm!
Finnish:      Hei maailma!
French:       Bonjour monde!
Frisian:      Hallo wrâld!
Georgian:     გამარჯობა მსოფლიო!
German:       Hallo Welt!
Greek:        Γειά σου Κόσμε!
Hausa:        Sannu Duniya!
Hebrew:       שלום עולם!
Hindi:        नमस्ते दुनिया!
Hungarian:    Helló Világ!
Icelandic:    Halló heimur!
Igbo:         Ndewo Ụwa!
Indonesian:   Halo Dunia!
Italian:      Ciao mondo!
Japanese:     こんにちは世界!
Kazakh:       Сәлем Әлем!
Khmer:        សួស្តី​ពិភពលោក!
Kyrgyz:       Салам дүйнө!
Lao:          ສະ​ບາຍ​ດີ​ຊາວ​ໂລກ!
Latvian:      Sveika pasaule!
Lithuanian:   Labas pasauli!
Luxemburgish: Moien Welt!
Macedonian:   Здраво свету!
Malay:        Hai dunia!
Malayalam:    ഹലോ വേൾഡ്!
Mongolian:    Сайн уу дэлхий!
Myanmar:      မင်္ဂလာပါကမ္ဘာလောက!
Nepali:       नमस्कार संसार!
Norwegian:    Hei Verden!
Pashto:       سلام نړی!
Persian:      سلام دنیا!
Polish:       Witaj świecie!
Portuguese:   Olá Mundo!
Punjabi:      ਸਤਿ ਸ੍ਰੀ ਅਕਾਲ ਦੁਨਿਆ!
Romanian:     Salut Lume!
Russian:      Привет мир!
Scots Gaelic: Hàlo a Shaoghail!
Serbian:      Здраво Свете!
Sesotho:      Lefatše Lumela!
Sinhala:      හෙලෝ වර්ල්ඩ්!
Slovenian:    Pozdravljen svet!
Spanish:      ¡Hola Mundo!
Sundanese:    Halo Dunya!
Swahili:      Salamu Dunia!
Swedish:      Hej världen!
Tajik:        Салом Ҷаҳон!
Thai:         สวัสดีชาวโลก!
Turkish:      Selam Dünya!
Ukrainian:    Привіт Світ!
Uzbek:        Salom Dunyo!
Vietnamese:   Chào thế giới!
Welsh:        Helo Byd!
Xhosa:        Molo Lizwe!
Yiddish:      העלא וועלט!
Yoruba:       Mo ki O Ile Aiye!
Zulu:         Sawubona Mhlaba!

Steven Penny 建议使用 PowerShell,不要更改代码页。下图表明问题仍然存在。

Windows 终端安装程序(不是 Windows 发行版的一部分)解决了 utf8 输出问题,请参阅随附的屏幕截图。

image_1 image_2 Power Shell Windows Terminal

红宝石 Windows UTF-8

评论

0赞 Joachim Sauer 5/29/2021
许多不同脚本正确显示的事实向我表明,代码基本上可以工作,但终端的字体选择可能存在问题。 在文本/字体处理方面,其相关的终端并不是最现代的东西,因此它可能无法为高棉语选择正确的字体。事实上,它似乎只尝试使用固定宽度的字体,这可能会使某些文本无法显示。第二个文本块是否从输出中复制?如果是这样,那只会加强它只是一个渲染问题。cmd.exe
0赞 Joachim Sauer 5/29/2021
如果直接将 的内容转储到控制台,会发生什么情况? 如果我没记错我的命令。hello_world.dattype hello_world.dat
0赞 Polar Bear 5/29/2021
@Joachim Sauer 结果与图片相同,看起来 Windows 10 无法在终端中正确复制亚洲字符。
0赞 Joachim Sauer 5/29/2021
这证明问题不在于 Ruby 或你的代码:你正在做正确的事情。是终端本身无法显示结果输出。

答:

1赞 Zombo 5/29/2021 #1

问题是,您正在使用一些非常古老的方法和工具。第一:

  • 本机代码页:437
  • 切换代码页:65001

您无需再弄乱代码页,只需将其保留为默认值即可。另外,从您的图片中,我看到您也在使用控制台主机,它也非常旧。Windows 终端 [1] 自 2019 年以来一直可用,并内置了 UTF-8 支持。使用 Windows 终端,即使不指定 UTF-8,我也可以运行您的脚本:

fname = 'hello_world.dat'

File.open(fname,'r') do |f|
   puts f.read
end

我得到了完美的结果:

要使用 Windows 终端,请下载文件 [2],然后安装它。或者,由于它本质上只是一个 Zip 文件,您可以将其重命名为并使用 Windows 将其解压缩,然后运行 .或者,由于您确实在此过程中遇到问题,因此可以使用我刚刚创建的便携式版本 [3] (风险自负)。msixbundlefile.zipWindowsTerminal.exe

  1. https://github.com/microsoft/terminal
  2. https://github.com/microsoft/terminal/releases/tag/v1.8.1444.0
  3. https://github.com/microsoft/terminal/files/6563899/CascadiaPackage_1.8.1444.0_x64.zip