недійсний багатобайтовий знак (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, і ТАК почне діяти дивно. Видаліть дивні пробіли та вкладки та нові рядки. Знову ж таки, просто вставити код у пустий та намагатися відформатувати свій код для презентації - це один із способів дати собі підказку.
boulder_ruby

Відповіді:


691

Ви спробували додати магічний коментар у сценарій, де ви використовуєте символи, що не належать до ASCII? Він повинен надходити на вершину сценарію.

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

Це працювало на мене, як на чарівність.


2
Хм ......... додав, що у верхній частині файлу, але все одно отримує те саме повідомлення про помилку. Будь-які пропозиції?
Артем Калинчук

8
Центральне пояснення можна знайти в статті @dalyons, пов'язана: вихідні файли отримують кодування US-ASCII, якщо не сказано інше. Якщо ви розмістите будь-який вміст, що не є ASCII, у рядку Stral без зміни вихідного кодування, Ruby помре з цією помилкою. Спасибі, хлопці, я нарешті зрозумів :-)
бас-т

2
#!/bin/env rubyне потрібно, якщо ви не запустите скрипт з командного рядка як виконуваний файл. # encodingЛінія працює сам по собі.
gak

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в термінал із кореня програми.


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

додавання 'gem magic_encoding' до gemfile на рейках 2.3 та рубіну 1.9 допомогло
Elmor

це не інтегрується в огіркові тести.
Поїздка

1
@Elmor Ніколи не слід розміщувати зовнішні бібліотеки у Gemfile такого проекту. magic_encodingце лише інструмент командного рядка, а не залежність від проекту.
Nowaker

17

Я просто хочу додати своє рішення:

я використовую німецькі umlauts, такі як ö, ü, ä, і я отримав ту ж помилку.
@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.