为什么我用#inspect获得Encoding :: CompatibilityError?

以下代码没有问题:

#encoding: utf-8 class Text def initialize(txt) @txt = txt end def inspect "" % @txt end end p Text.new('Hello World') 

但是,如果我尝试使用p Text.new('Hä, was soll das?')我会得到一个Encoding :: CompatibilityError:

 inspect_with_umlaut.rb:26:in `p': inspected result must be ASCII only or use the default external encoding (Encoding::CompatibilityError) from inspect_with_umlaut.rb:26:in `' 

为什么这个?

更重要的是:我该如何避免它?

错误消息已解释原因: 检查结果必须仅为ASCII或使用默认外部编码

在这种情况下,inspect-command获取UTF-8字符(非ASCII),但默认编码似乎是另一个。 可以在Encoding.default_external读取默认编码。

为避免错误,您必须对inspect的结果进行编码:

 #encoding: utf-8 class Text def initialize(txt) @txt = txt end def inspect #force ASCII and replace invalid/undefined characters ("" % @txt).encode('ASCII', :undef => :replace, :invalid => :replace) end end p Text.new('Hä, was soll das?') #->  

您可以使用Encoding.default_external代替encodeASCII

 ("" % @txt).encode(Encoding.default_external, :undef => :replace)