недопустимый многобайтовый символ (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.