Ruby 1.9 + Sinatra 不兼容的字符编码:ASCII-8BIT 和 UTF-8。

6

我正在尝试将一个sinatra应用程序迁移到ruby 1.9

我使用的是sinatra 1.0,rack 1.2.0和erb模板

当我启动sinatra时它可以工作,但是当我从浏览器请求网页时,我会收到这个错误:

Encoding::CompatibilityError at /
incompatible character encodings: ASCII-8BIT and UTF-8

所有.rb文件都有以下头部:

#!/usr/bin/env ruby
# encoding: utf-8

我认为问题在erb文件中,即使它显示为UTF-8编码

[user@localhost views]$ file home.erb
home.erb: UTF-8 Unicode text

有人之前遇到过这个问题吗?Sinatra是否与Ruby 1.9不完全兼容?

尝试将文件临时更改为仅限ASCII。 - Adrian
1
问题在于我需要在模板中使用UTF-8字符。 - John
如果您正在使用HTML,则应将它们替换为实体。否则,您可能想尝试暂时将它们移除以查看它们是否是问题的原因。 - Adrian
2个回答

16

我对你的具体情况不熟悉,但是在Ruby 1.9中,如果尝试将源代码(通常使用UTF-8编码)中的字符串与外部系统的字符串(例如来自HTML表单或数据库的数据)进行连接,就会出现这种错误。

ASCII-8BIT基本上是二进制的同义词。它表明输入字符串没有标记使用的实际编码(例如UTF-8或ISO-8859-1)。

据我的理解,在Ruby 1.8中不会看到异常消息,因为它将字符串视为二进制并默默地连接不同编码的字符串。由于微妙的原因,这通常不是问题。

昨天我遇到了类似的错误,并找到了这篇简明的概述。

消除错误消息的一个选项是对来自外部源的字符串使用force_encoding('UTF-8')(或其他编码)。这不应该轻易执行,并且您需要了解其影响。


0

我曾经遇到过同样的问题。问题出在一个应该是us-ascii编码的文件被utf8编码了。

我使用了file命令(在OSX上)进行了检查:

$ file --mime-encoding somefile
somefile: utf-8

从文件中删除奇怪的字符后:

$ file --mime-encoding somefile
somefile: us-ascii

这个对我的问题有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接