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öÖçÇ"
我想在 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öÖçÇ"