Ошибка «Недопустимый многобайтовый символ (US-ASCII)» для ä, ü, ö, ß, которые являются Ascii! - PullRequest
3 голосов
/ 14 августа 2010

Мое приложение должно обрабатывать некоторые международные символы, а именно ä, ü, ö и ß, которые все еще являются ascii.

Когда я тестировал поведение ruby ​​при работе с этими символами, я получил эту ошибку:

test.rb:1: invalid multibyte char (US-ASCII)
test.rb:1: invalid multibyte char (US-ASCII)

для этого кода:

puts "i like my chars: ä, ü, ö and ß!"

Но странная вещь: при использовании интерактивной оболочки Ruby я не получаю ошибки!

РЕДАКТИРОВАТЬВ моем приложении я извлекаю данные из внешнего API.Приведенный выше код является просто примером!

Ответы [ 6 ]

11 голосов
/ 14 августа 2010

Нет, эти символы не являются в ASCII.ASCII не имеет значений выше Unicode U + 007F (десятичное 127).Для получения дополнительной информации см. Запись в Википедии ASCII .

Я подозреваю, что интерактивная оболочка Ruby принимает собственное кодирование вашей оболочки, а не ASCII.

У вас естьспособ указать кодировку вашего файла .rb?Если это так, используйте это - или измените ваши сценарии так, чтобы они действительно были ASCII.

8 голосов
/ 17 августа 2010

Поместите волшебный комментарий # coding: utf-8 в начале вашего сценария (во второй строке, если вы используете шебанг).

#!/usr/local/bin/ruby
# coding: utf-8

puts "i like my chars: ä, ü, ö and ß!"
1 голос
/ 14 августа 2010

Это не символы ASCII ... Просто они все-таки кодируются одним байтом в некоторых устаревших наборах символов, полученных из ASCII. Скорее всего, происходит то, что ваш исходный файл сохраняется как UTF-8, потому что он содержит символы не ASCII, и ruby ​​правильно обрабатывает это.

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

0 голосов
/ 02 марта 2012

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

# encoding: utf-8

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

Или, если вы хотите сделать проект широким, у вас есть опция magic-кодирование самоцвет

0 голосов
/ 04 февраля 2012

Что мне сработало, так это удаление строки shebang и запуск скрипта прямо из ruby19 под macosx:

GreyJewel:Moralytics atma$ head -n1 moralytics 
**# coding: utf-8**
GreyJewel:Moralytics atma$ which ruby
/opt/local/bin/ruby
GreyJewel:Moralytics atma$ ruby --version
ruby 1.9.3p0 (2011-10-30 revision 33570) [x86_64-darwin11]
GreyJewel:Moralytics atma$ ruby moralytics 
Το λεξικό που χρησιμοποιούμε έχει: 407117 λέξεις
Το λεξιλόγειο του χρήστη atmat εμπεριέχει: 3943 λέξεις συνολικά.

Это сработало. Использование shebang вызывает ошибку. Я не могу точно сказать, почему.

0 голосов
/ 14 августа 2010

Чтобы экранировать символы для кодировки ASCII, используйте escape-последовательности Unicode:

puts "i like my chars: \u00E4, \u00FC, \u00F6 and \u00DF!"

Ruby 1.9, в любом случае - я не помню, работает ли это в 1.8.

...