为什么我用#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
代替encode
的ASCII
:
("" % @txt).encode(Encoding.default_external, :undef => :replace)