Rat*_*lle 5 ruby haml encoding padrino
请遵循以下代码:
__ENCODING__
# => #<Encoding:UTF-8>
Encoding.default_internal
# => #<Encoding:UTF-8>
Encoding.default_external
# => #<Encoding:UTF-8>
Run Code Online (Sandbox Code Playgroud)
案例1:HAML抛出 Encoding::UndefinedConversionError
string = "j\xC3\xBCrgen".force_encoding('ASCII-8BIT')
string.encoding
# => #<Encoding:ASCII-8BIT>
Haml::Engine.new("#{string}").render
## => Encoding::UndefinedConversionError: "\xC3" from ASCII-8BIT to UTF-8
ERB.new("<%= string %>").result(binding)
# => "jürgen"
# => Resulting encoding is #<Encoding:UTF-8>
Erubis::Eruby.new("<%= string %>").result(binding)
# => "j\xC3\xBCrgen"
# => resulting encoding is #<Encoding:ASCII-8BIT>
Run Code Online (Sandbox Code Playgroud)
案例2:HAML不会抛出错误
string = "Ratatouille".force_encoding('ASCII-8BIT')
string.encoding
# => #<Encoding:ASCII-8BIT>
Haml::Engine.new("#{string}").render
## => "Ratatouille\n"
## => resulting encoding is #<Encoding:UTF-8>
ERB.new("<%= string %>").result(binding)
# => "Ratatouille"
# => resulting encoding is #<Encoding:UTF-8>
Erubis::Eruby.new("<%= string %>").result(binding)
# => "Ratatouille"
# => result encoding is #<Encoding:US-ASCII>
Run Code Online (Sandbox Code Playgroud)
问题:为什么HAML在案例1中失败并在案例2中成功
为什么我要问我在HAML中渲染因为Encoding :: CompatibilityError导致页面爆炸时遇到类似的问题
现在唯一的方法我认为我知道如何避免错误这是我的字符串强制执行到UTF8使用.force_encoding('UTF-8')哪种避免这个问题,但我必须在每个我想使用给定字符串的页面中执行此操作,即"j\xC3\xBCrgen"(考虑到他们的许多页面我觉得有点蹩脚)
任何线索?
Haml 正在尝试将结果字符串编码为您的Encoding.default_internal设置。在第一个示例中,字符串 ( "j\\xC3\\xBCrgen") 包含非 ASCII 字节(即设置了高位的字节),而第二个示例中的字符串 ( "Ratatouille") 不包含\xe2\x80\x99t。Ruby 可以对第二个字符串进行编码(因为 UTF-8 是 ASCII 的超集),但可以对第一个字符串进行\xe2\x80\x99t 编码并引发错误。
解决此问题的一种方法是将字符串编码作为选项显式传递给Haml::Encoding:
Haml::Engine.new("#{string}", :encoding => Encoding::ASCII_8BIT).render\nRun Code Online (Sandbox Code Playgroud)\n\n这将为您提供一个同样是 ASCII-8BIT 的结果字符串。
\n\n在这种情况下,有问题的字符串是UTF-8,因此更好的解决方案可能是查看该字符串来自应用程序中的位置并确保它具有正确的编码。
\n\n我对 ERB 和 Erubis 的了解不够,无法说出 xe2x80x99 发生了什么,看起来 ERB 错误地假设它是 UTF-8(它现在有办法知道这些字节实际上应该被处理)作为 UTF-8),而 Erubis 正在做更明智的事情,将编码保留为二进制 \xe2\x80\x93 ,因为它根本不执行任何编码,或者它正在专门处理二进制编码输入。
\n| 归档时间: |
|
| 查看次数: |
578 次 |
| 最近记录: |