Отображение UTF-8 в ERB говорит «несовместимые кодировки символов» (база данных не используется) - PullRequest
1 голос
/ 22 июля 2011

На моей странице ERB я хочу отобразить одно из названий стран, настроенных в этом CSV-файле:

Suisse
Deutschland
日本

Вот код, который загружает CSV в config/initializers:

require 'csv'
COUNTRIES = CSV.read("#{RAILS_ROOT}/config/countries.csv").flatten

Вот код в ERB:

<%= "Country:" + COUNTRIES[id].to_s %>

Я хорошо отображаю, когда id = 0 или id = 1, но когда id = 2 появляется ошибка:

incompatible character encodings: ASCII-8BIT and UTF-8

... с ошибкой, указывающей на строку ERB выше.
Как это исправить?

База данных не задействована, Ruby 1.9.2-p180.UTF-8 из файлов локализации отображается нормально.

Ответы [ 2 ]

4 голосов
/ 25 июля 2011

Из CSV # read docs:

Этот метод также понимает дополнительный параметр: encoding, который можно использовать для указания кодировки данных в файле для чтения,Вы должны предоставить это, если ваши данные не находятся в Encoding :: default_external ().CSV будет использовать это, чтобы определить, как анализировать данные.

Поэтому, чтобы быть в безопасности, я бы сначала использовал

COUNTRIES = CSV.read("/Users/dumitru/test.csv", { encoding: "UTF-8" }).flatten

и проверил, что

COUNTRIES[2].encoding.name

говорит а) сразу после CSV#read и б) при выполнении в вашем шаблоне ERB.Если там написано «US-ASCII», вам следует проверить, случайно ли что-то изменило ваши СТРАНЫ после их анализа.По крайней мере, тогда вы можете быть уверены, что между ними что-то странное.

Я бы также предпочел

<%= "Country:" + COUNTRIES[id] %>

, поскольку у вас там уже есть строки.Но я не думаю, что это вылечит проблему.

Я не мог себе представить, что что-то на самом деле изменило содержимое строки, но, возможно, кодировка стала ассоциироваться как US-ASCII.Таким образом, у вас может быть хороший шанс использовать

COUNTRIES[2].force_encoding("UTF-8")

со своей строкой для принудительного установления связи обратно в UTF-8.Если это не поможет, я попробую

COUNTRIES[2].encode("UTF-8")

. Если все эти методы не сработают, мне потребуется знать кодировку во время попытки рендеринга строки в шаблоне ERB, чтобы помочь вам в дальнейшем..

0 голосов
/ 22 июля 2011

кажется, что ваш CSV-файл не сохранен в UTF-8, попробуйте преобразовать его в utf-8

edit: я протестировал приведенный выше пример на своем локальном Mac, используя ту же версию rubyи это работает без проблем.Я создал CSV с нуля и протестирован на IRB.

ruby-1.9.2-p180 :004 > require 'csv'
=> true  
ruby-1.9.2-p180 :006 > COUNTRIES = CSV.read("/Users/dumitru/test.csv").flatten
=> ["Suisse", "Deutschland", "\xE6\x97\xA5\xE6\x9C\xAC"] 
ruby-1.9.2-p180 :007 > "Country:" + COUNTRIES[0].to_s
=> "Country:Suisse" 
ruby-1.9.2-p180 :009 > "Country:" + COUNTRIES[2].to_s
=> "Country:\xE6\x97\xA5\xE6\x9C\xAC" 
...