Ruby windows 10 终端输入上的 irb utf-8 编码问题

Ruby irb utf-8 encoding problem on windows 10 terminal input

我想在 windows 中使用带有终端输入的 ruby。为什么 ruby 社区无法在 windows 上解决这个 UTF-8 问题?难吗?我想知道 python、java 或其他语言是如何做到这一点的?我可以毫无痛苦地使用 python 在 windows utf-8 上工作。

与ruby3.0.1

x = gets.chomp
çağrı
=> "\x87a\xA7r\x8D"

puts x
�a�r�
=> nil

x.valid_encoding?
=> false

我查了这个https://bugs.ruby-lang.org/issues/16604 它没有用。

对于 Ruby 3.0,默认外部编码(即从 ruby 进程外部读取的任何数据的假定编码,例如使用 [=11= 时从您的 shell ] 在 Windows 上更改为 UTF-8。这是对 Windows 上编码出现的各种问题的回应。

但是,您从 shell 那里读取的数据不是 UTF-8 编码的。相反,您的 shell 似乎使用了一些不同的编码,例如cp850.

一个可能的解决方法是指示 Ruby 假定您的环境的语言环境编码,您可以在命令调用时使用 -E 开关进行设置,例如:

irb -E locale

或者通过在脚本中手动设置 Encoding.default_external 为您的环境的正确编码。

土耳其语 windows PC 的 cmd shell 使用 CP857

的编码

您可以在 cmd > 首选项部分看到它

这是 Holger 贡献的练习解决方案。

irb(main):005:0> x = gets.chomp
Here is the Turkish chars ğĞüÜşŞiİıIöÖçÇ
=> "Here is the Turkish chars \xA7\xA6\x81\x9A\x9F\x9Ei\x98\x8DI\x94\x99\x87\x80"

irb(main):006:0> x.force_encoding "CP857"
=> "Here is the Turkish chars \xA7\xA6\x81\x9A\x9F\x9Ei\x98\x8DI\x94\x99\x87\x80"

irb(main):007:0> x.valid_encoding?
=> true
irb(main):008:0> x.encode("UTF-8", undef: :replace)
=> "Here is the Turkish chars ğĞüÜşŞiİıIöÖçÇ"