Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Ruby中使用open3为stdin和stdout设置特定编码_Ruby_Encoding_Utf 8 - Fatal编程技术网

如何在Ruby中使用open3为stdin和stdout设置特定编码

如何在Ruby中使用open3为stdin和stdout设置特定编码,ruby,encoding,utf-8,Ruby,Encoding,Utf 8,当分别通过stdin和stdout发送输入和捕获输出时,是否可以将编码设置为utf-8,以便(™),等可以保存吗 以下是我的代码(我使用的是windows,我认为输出有以下编码:IBM866): 正如您所看到的,由于不同的编码,特殊字符不会保留在输出中。因此,如何在标准输出中恢复这些字符?这是一个奇怪的小问题。我认为这将起作用: stdout.gets.encode(Encoding::IBM866, Encoding::UTF_8) 这将告诉encode源编码和目标编码。请注意,在调用gsu

当分别通过stdin和stdout发送输入和捕获输出时,是否可以将编码设置为utf-8,以便(™),等可以保存吗

以下是我的代码(我使用的是windows,我认为输出有以下编码:IBM866):


正如您所看到的,由于不同的编码,特殊字符不会保留在输出中。因此,如何在标准输出中恢复这些字符?

这是一个奇怪的小问题。我认为这将起作用:

stdout.gets.encode(Encoding::IBM866, Encoding::UTF_8)
这将告诉
encode
源编码和目标编码。请注意,在调用
gsub
或字符串上的任何其他正则表达式方法之前,需要执行此操作

您可以使用来告诉
stdout
对象为您执行转换,从而跳过此操作:

stdout.set_encoding(Encoding::IBM866, Encoding::UTF_8)
popen3
块中,第一件事就是这样做

值得一提的是,下面是我用来测试这个的代码:

# ™(returns тДв)
a = [209, 130, 208, 148, 208, 178] 

# à(returns ├а)
b = [226, 148, 156, 208, 176]

a_str = a.pack("c*")
puts a_str.encode(Encoding::IBM866, Encoding::UTF_8)
# => ™

b_str = b.pack("c*")
puts b_str.encode(Encoding::IBM866, Encoding::UTF_8)
# => à

为什么您认为输出有IBM866编码?什么是标准输出。内部编码和外部编码返回?句子数组中项目的编码是什么?返回字符串中有问题的字符的实际字节值是什么?@Jordan当我尝试执行string.match时,它给出了错误
不兼容的编码regexp匹配(带IBM866字符串的UTF-8 regexp)(encoding::CompatibilityError)
内部\u编码返回nil,
外部\u编码返回
IBM866。对于™(返回)的
[209、130、208、148、208、178]
表示a(返回├а)其
[226、148、156、208、176]
刚刚尝试过,但第一个给出了从UTF-8到IBM866的
U+00E9(编码::UndefinedConversionError)
第二个(即在open block start下正确设置编码)没有给出错误,但给出了相同的错误字符。
# ™(returns тДв)
a = [209, 130, 208, 148, 208, 178] 

# à(returns ├а)
b = [226, 148, 156, 208, 176]

a_str = a.pack("c*")
puts a_str.encode(Encoding::IBM866, Encoding::UTF_8)
# => ™

b_str = b.pack("c*")
puts b_str.encode(Encoding::IBM866, Encoding::UTF_8)
# => à