недопустимый многобайтовый символ (US-ASCII) с Rails и Ruby 1.9


197

Я использую Ruby 1.9.1 с Rails 2.3.4 Мое приложение для обработки ввода текста

Если я попробую что-то вроде (внутренние кавычки выглядят иначе)

text = "”“"

Я получаю следующую ошибку:

#<SyntaxError: /Users/tammam56/rubydev/favquote/lib/daemons/twitter_quotes_fetch.rb:54: invalid multibyte char (US-ASCII)
/Users/tammam56/rubydev/favquote/lib/daemons/twitter_quotes_fetch.rb:54: invalid multibyte char (US-ASCII)
/Users/tammam56/rubydev/favquote/lib/daemons/twitter_quotes_fetch.rb:54: syntax error, unexpected $end, expecting keyword_end

Мне нужно использовать эти кавычки, поскольку пользователи могут их вводить, и я должен это учитывать?

Любые идеи?


Если в вашем коде нет обратных ссылок, но вас «обвиняют» в использовании обратных ссылок, в вашем файле могут быть странные проблемы с пробелами / символами табуляции / новой строки. Попробуйте разместить его в бланке StackOverflow, например, и SO начнет вести себя странно. Удалите странные пробелы и вкладки и новые строки. Опять же, просто вставьте код в SO пустую и попытайтесь отформатировать код для презентации - это один из способов дать вам подсказку.
boulder_ruby

Ответы:


691

Вы пытались добавить магический комментарий в сценарий, где вы используете символы не ASCII? Это должно идти поверх сценария.

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

Это сработало для меня как шарм.


2
Хм ......... добавил это в начало файла, но все равно получаю то же сообщение об ошибке. Какие-либо предложения?
Артем Калинчук

8
Центральное объяснение можно найти в статье @dalyons по ссылке: исходные файлы получают кодировку US-ASCII, если не указано иное. Если вы поместите любое содержимое, отличное от ASCII, в литерал String без изменения исходной кодировки, Ruby умрет с этой ошибкой. Спасибо, ребята, я наконец-то понял :-)
bass-t

2
#!/bin/env rubyне требуется, если вы не запускаете скрипт из командной строки как исполняемый файл. # encodingЛиния работает сам по себе.
Гак

10
# encoding: utf-8, Уже конец 2013 года, и мы все еще должны играть в эту игру. Держись, телефон звонит ... Это был 2033, они позвонили, чтобы сказать, что они все еще играют. Ну что ж, спасибо, что напомнили мне, Ярек Змудзински из 2010 года.
thomax

1
@gotqn - Пожалуйста, найдите ту же статью здесь - graysoftinc.com/character-encodings/…
Alok Swain

43

Если вы хотите легко добавить волшебные комментарии ко всем исходным файлам проекта, вы можете использовать magic_encodingгем

sudo gem install magic_encoding

затем просто позвоните magic_encodingв терминал из корня вашего приложения.


Я думаю, что важно помнить такого рода детали, поэтому я бы не использовал этот драгоценный камень по крайней мере в течение нескольких месяцев написания # encoding: utf-8 вручную.
Марсель Вальдес Орозко

добавление 'gem magic_encoding' в gemfile на рельсах 2.3 & ruby ​​1.9 помогли
Elmor

это не интегрируется в тесты на огурцы.
Поездка

1
@Elmor Вы никогда не должны помещать внешние библиотеки в Gemfile вашего проекта таким образом. magic_encodingэто просто инструмент командной строки, а не зависимость проекта.
Новакер

17

Я просто хочу добавить свое решение:

я использую немецкие умлауты, такие как ö, ü, ä, и получаю ту же ошибку.
@Jarek Zmudzinski только что рассказал вам, как это работает, но вот мое:

Добавьте этот код в верхней части вашего контроллера: # encoding: UTF-8
(например, чтобы использовать флэш-сообщение с Umlauts)

пример моего контроллера:

# encoding: UTF-8
class UserController < ApplicationController

Теперь вы можете использовать ö, ä, ü, ß, "" и т. Д.


8

Эти наклонные двойные кавычки не являются символами ASCII. Сообщение об ошибке вводит в заблуждение о том, что они являются «многобайтовыми».


2
Почему это вводит в заблуждение? Они являются многобайтовыми символами.
Мэтью Шарли

4
Потому что ASCII не определяет какие-либо многобайтовые кодировки. Что касается ASCII, то это бред, который оказывается действительным в соответствующей кодировке.
Фил Миллер

8

Просто обратите внимание, что с Ruby 2.0 нет необходимости добавлять # encoding: utf-8. UTF-8 определяется автоматически.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.