Ruby 有时会打印 unicode 转义字符而不是字符本身。为什么?
Ruby sometimes prints unicode-escaped chars instead of the chars themselves. Why?
我使用 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" 字符串的数组?
这在 Windows 上尤为明显。在其他 *nix 系统上,它可能工作正常 - 例如,在 https://repl.it/ 上你会看到正确的输出,因为它很可能托管在 *nix 系统上。
根据文档,Array#to_s
是
Alias for: inspect
Array#inspect
对每个数组成员调用 inspect
,在这种情况下,数组成员都是字符串,因此将调用 String#inspect
。
String#inspect
使用 Encoding#default_external
as specified in documentation 检查结果。
The default external encoding is used by default for strings created
from the following locations:
- CSV
- File data read from disk
- SDBM
- StringIO
- Zlib::GzipReader
- Zlib::GzipWriter
- String#inspect
- Regexp#inspect
在 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=[\"Привет\"]"
只需尝试 irb console
或 rails console
.
应该可以。
注: Kindly check also difference between p and 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" 字符串的数组?
这在 Windows 上尤为明显。在其他 *nix 系统上,它可能工作正常 - 例如,在 https://repl.it/ 上你会看到正确的输出,因为它很可能托管在 *nix 系统上。
根据文档,Array#to_s
是
Alias for: inspect
Array#inspect
对每个数组成员调用 inspect
,在这种情况下,数组成员都是字符串,因此将调用 String#inspect
。
String#inspect
使用 Encoding#default_external
as specified in documentation 检查结果。
The default external encoding is used by default for strings created from the following locations:
- CSV
- File data read from disk
- SDBM
- StringIO
- Zlib::GzipReader
- Zlib::GzipWriter
- String#inspect
- Regexp#inspect
在 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=[\"Привет\"]"
只需尝试 irb console
或 rails console
.
应该可以。
注: Kindly check also difference between p and puts
希望这个回答对你有帮助!!!