Ruby有时打印unicode-escaped chars而不是chars本身。为什么?

时间:2015-12-24 14:12:55

标签: ruby puts

我使用ruby 2.2.3p173和Sublime 3.我的所有字符串都已经编码('utf-8')。在Linux中,我有,我期待。尝试输出:

a = [ "Привет" ]
puts "puts=#{a}"
p "p=#{a}"
print "print=#{a}\n"

puts a[ 0 ]
p a[ 0 ]
print a[ 0 ] + "\n"
p a[ 0 ].encoding
p __ENCODING__

输出是:

puts=["\u041F\u0440\u0438\u0432\u0435\u0442"]
"p=[\"\\u041F\\u0440\\u0438\\u0432\\u0435\\u0442\"]"
print=["\u041F\u0440\u0438\u0432\u0435\u0442"]
Привет
"\u041F\u0440\u0438\u0432\u0435\u0442"
Привет
#<Encoding:UTF-8>
#<Encoding:UTF-8>

我期待:

puts=["Привет"]
"p=[\"Привет\"]"
print=["Привет"]
Привет
"Привет"
Привет

如何在一行中打印带有几个“utf-8”字符串的数组?

2 个答案:

答案 0 :(得分:2)

在Windows上尤其如此。在其他* nix系统上,它可能正常工作 - 例如,在https://repl.it/上您看到正确的输出,因为它很可能托管在* nix系统上。

根据文档,Array#to_s

  

别名:inspect

Array#inspect在每个数组成员上调用inspect,在这种情况下,数组成员都是字符串,因此将调用String#inspect

String#inspect使用Encoding#default_external as specified in documentation作为检查结果。

  

默认情况下,对创建的字符串使用默认外部编码   来自以下地点:

     
      
  • CSV
  •   
  • 从磁盘读取的文件数据
  •   
  • SDBM
  •   
  • StringIO的
  •   
  • 的zlib :: GzipReader
  •   
  • 的zlib :: GzipWriter
  •   
  • 字符串#检查
  •   
  • 正则表达式#检查
  •   

在Windows上,默认外部编码不是UTF-8,因此,我们会在String#inspect的输出中看到转义的序列。

p Encoding::default_external
#=> #<Encoding:IBM437>

我们将默认外部编码更改为UTF-8,输出正确:

Encoding::default_external = Encoding::UTF_8

a = [ "Привет" ]
puts "puts=#{a}"
#=> puts=["Привет"]

p "p=#{a}"
#=> "p=[\"Привет\"]"

答案 1 :(得分:0)

尝试 irb console rails console

应该可以。

enter image description here

注意: Kindly check also difference between p and puts

希望这个答案可以帮助你!!!