Неверный многобайтовый символ (UTF-8), ошибка, Ruby
Я попытался запустить скрипт ruby в рельсах с помощью команды rails runner. Файл ruby выглядит примерно так и должен создавать новых пациентов:
Patient.create!({:vorname => 'Josepha', :nachnahme => 'Brecht', :geburtsdatum => '25.04.1963', :strasse => 'Umdorf', :ort => 'Wörthss', :plz => '93093'})
Patient.create!({:vorname => 'Tumba', :nachnahme => 'Hoch', :geburtsdatum => '17.77.1956', :strasse => 'Hamaß 1', :ort => 'Brenn', :plz => '93189'})
Но почему-то у моего кода проблемы с немецким языком! Я начинающий программист и не знаю, что мне нужно изменить! Спасибо за помощь!
C:\Sites\what>rails runner patienten.rb
C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/railties-3.2.13/lib/rails/c
ommands/runner.rb:51:in `eval': patienten.rb:2: invalid multibyte char (UTF-8) (
SyntaxError)
patienten.rb:2: syntax error, unexpected tIDENTIFIER, expecting '}'
...> 'Schlossberg', :ort => 'Wörth', :plz => '93086'})
... ^
patienten.rb:2: syntax error, unexpected tINTEGER, expecting $end
...:ort => 'Wörth', :plz => '93086'})
... ^
from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/railties-3.2.1
3/lib/rails/commands/runner.rb:51:in `<top (required)>'
from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/railties-3.2.1
3/lib/rails/commands.rb:64:in `require'
from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/railties-3.2.1
3/lib/rails/commands.rb:64:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'
4 ответа
В каком формате находится этот файл? Вы уверены, что это UTF-8, а не Windows 1252, как по умолчанию в Windows?
В Ruby 1.9 заголовок вашего файла должен указывать фактическое используемое форматирование:
# encoding: UTF-8
Если это не сработает, возможно, вам придется поэкспериментировать с другими:
# encoding: Windows-1252
Другой распространенный формат - ISO Latin1:
# encoding: ISO-8859-1
И 1252, и 8859-1 являются однобайтовыми наборами символов, каждый символ всегда равен одному байту, где UTF-8 - переменная длина, каждый символ - один или несколько байтов.
Если вам нужно конвертировать между форматами, обычно вы можете открыть в редакторе, который знает кодировку, и "Сохранить как..." с нужной вам кодировкой. В противном случае вы можете попробовать использовать iconv, чтобы конвертировать его для вас.
irb(main):088:0> "hi\x99!".encode("UTF-8", "Windows-1252")
=> "hi™!"
У Джастина Вайса есть отличная статья о кодировании в Ruby. https://www.justinweiss.com/articles/3-steps-to-fix-encoding-problems-in-ruby/
Поместите эти две строки вверху сценария.
#!/bin/env ruby
# encoding: utf-8