Неверный многобайтовый символ (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

Добавлять

# -*- encoding : utf-8 -*-

в верхней части файла

Другие вопросы по тегам