несовместимые кодировки символов: ASCII-8BIT и UTF-8

Я использую Ruby 1.9.2 и Rails 3.0.5

У меня следующая ошибка:

несовместимые кодировки символов: ASCII-8BIT и UTF-8

Я думаю, это не имеет ничего общего с базой данных.

Ошибка возникает в этой строке в представлении (просто вызов div haml):

#content

полный стек:

    ActionView::Template::Error (incompatible character encodings: ASCII-8BIT and UTF-8):
        21:                     -flash.each do |name, msg|
        22:                         =content_tag :div, msg, :id => "flash_#{name}"
        23:                         %div.clear                      
        24:                     #content                                        
        25:                         = yield
        26:             = render :partial => "layouts/grid_right" if render_grid_right?
        27:             = render :partial => "layouts/footer"
      app/views/layouts/application.html.haml:24:in `_app_views_layouts_application_html_haml___4380000789490545718_2180251300_2717546578298801795'
      actionpack (3.0.5) lib/action_view/template.rb:135:in `block in render'
      activesupport (3.0.5) lib/active_support/notifications.rb:54:in `instrument'
      actionpack (3.0.5) lib/action_view/template.rb:127:in `render'
      actionpack (3.0.5) lib/action_view/render/layouts.rb:80:in `_render_layout'
      actionpack (3.0.5) lib/action_view/render/rendering.rb:62:in `block in _render_template'
      activesupport (3.0.5) lib/active_support/notifications.rb:52:in `block in instrument'
      activesupport (3.0.5) lib/active_support/notifications/instrumenter.rb:21:in `instrument'
      activesupport (3.0.5) lib/active_support/notifications.rb:52:in `instrument'
      actionpack (3.0.5) lib/action_view/render/rendering.rb:56:in `_render_template'
      actionpack (3.0.5) lib/action_view/render/rendering.rb:26:in `render'
      haml (3.0.25) lib/haml/helpers/action_view_mods.rb:13:in `render_with_haml'
      actionpack (3.0.5) lib/abstract_controller/rendering.rb:115:in `_render_template'
      actionpack (3.0.5) lib/abstract_controller/rendering.rb:109:in `render_to_body'
      actionpack (3.0.5) lib/action_controller/metal/renderers.rb:47:in `render_to_body'
      actionpack (3.0.5) lib/action_controller/metal/compatibility.rb:55:in `render_to_body'
      actionpack (3.0.5) lib/abstract_controller/rendering.rb:102:in `render_to_string'
      actionpack (3.0.5) lib/abstract_controller/rendering.rb:93:in `render'
      actionpack (3.0.5) lib/action_controller/metal/rendering.rb:17:in `render'
      actionpack (3.0.5) lib/action_controller/metal/instrumentation.rb:40:in `block (2 levels) in render'
      activesupport (3.0.5) lib/active_support/core_ext/benchmark.rb:5:in `block in ms'
      /Users/michaelkoper/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/benchmark.rb:309:in `realtime'
      activesupport (3.0.5) lib/active_support/core_ext/benchmark.rb:5:in `ms'
      actionpack (3.0.5) lib/action_controller/metal/instrumentation.rb:40:in `block in render'
      actionpack (3.0.5) lib/action_controller/metal/instrumentation.rb:78:in `cleanup_view_runtime'
      activerecord (3.0.5) lib/active_record/railties/controller_runtime.rb:15:in `cleanup_view_runtime'
      actionpack (3.0.5) lib/action_controller/metal/instrumentation.rb:39:in `render'
      actionpack (3.0.5) lib/action_controller/metal/implicit_render.rb:10:in `default_render'
      actionpack (3.0.5) lib/action_controller/metal/mime_responds.rb:261:in `block in retrieve_response_from_mimes'
      actionpack (3.0.5) lib/action_controller/metal/mime_responds.rb:192:in `call'
      actionpack (3.0.5) lib/action_controller/metal/mime_responds.rb:192:in `respond_to'
      app/controllers/home_controller.rb:9:in `index'
      actionpack (3.0.5) lib/action_controller/metal/implicit_render.rb:4:in `send_action'
      actionpack (3.0.5) lib/abstract_controller/base.rb:150:in `process_action'
      actionpack (3.0.5) lib/action_controller/metal/rendering.rb:11:in `process_action'
      actionpack (3.0.5) lib/abstract_controller/callbacks.rb:18:in `block in process_action'
      activesupport (3.0.5) lib/active_support/callbacks.rb:445:in `_run__3968431659371141392__process_action__3163094469870857953__callbacks'
      activesupport (3.0.5) lib/active_support/callbacks.rb:409:in `_run_process_action_callbacks'
      activesupport (3.0.5) lib/active_support/callbacks.rb:93:in `run_callbacks'
      actionpack (3.0.5) lib/abstract_controller/callbacks.rb:17:in `process_action'
      actionpack (3.0.5) lib/action_controller/metal/instrumentation.rb:30:in `block in process_action'
      activesupport (3.0.5) lib/active_support/notifications.rb:52:in `block in instrument'
      activesupport (3.0.5) lib/active_support/notifications/instrumenter.rb:21:in `instrument'
      activesupport (3.0.5) lib/active_support/notifications.rb:52:in `instrument'
      actionpack (3.0.5) lib/action_controller/metal/instrumentation.rb:29:in `process_action'
      actionpack (3.0.5) lib/action_controller/metal/rescue.rb:17:in `process_action'
      actionpack (3.0.5) lib/abstract_controller/base.rb:119:in `process'
      actionpack (3.0.5) lib/abstract_controller/rendering.rb:41:in `process'
      actionpack (3.0.5) lib/action_controller/metal.rb:138:in `dispatch'
      actionpack (3.0.5) lib/action_controller/metal/rack_delegation.rb:14:in `dispatch'
      actionpack (3.0.5) lib/action_controller/metal.rb:178:in `block in action'
      actionpack (3.0.5) lib/action_dispatch/routing/route_set.rb:62:in `call'
      actionpack (3.0.5) lib/action_dispatch/routing/route_set.rb:62:in `dispatch'
      actionpack (3.0.5) lib/action_dispatch/routing/route_set.rb:27:in `call'
      rack-mount (0.6.13) lib/rack/mount/route_set.rb:148:in `block in call'
      rack-mount (0.6.13) lib/rack/mount/code_generation.rb:93:in `block in recognize'
      rack-mount (0.6.13) lib/rack/mount/code_generation.rb:68:in `optimized_each'
      rack-mount (0.6.13) lib/rack/mount/code_generation.rb:92:in `recognize'
      rack-mount (0.6.13) lib/rack/mount/route_set.rb:139:in `call'
      actionpack (3.0.5) lib/action_dispatch/routing/route_set.rb:492:in `call'
      haml (3.0.25) lib/sass/plugin/rack.rb:41:in `call'
      actionpack (3.0.5) lib/action_dispatch/middleware/best_standards_support.rb:17:in `call'
      actionpack (3.0.5) lib/action_dispatch/middleware/head.rb:14:in `call'
      rack (1.2.1) lib/rack/methodoverride.rb:24:in `call'
      actionpack (3.0.5) lib/action_dispatch/middleware/params_parser.rb:21:in `call'
      actionpack (3.0.5) lib/action_dispatch/middleware/flash.rb:182:in `call'
      actionpack (3.0.5) lib/action_dispatch/middleware/session/abstract_store.rb:149:in `call'
      actionpack (3.0.5) lib/action_dispatch/middleware/cookies.rb:302:in `call'
      activerecord (3.0.5) lib/active_record/query_cache.rb:32:in `block in call'
      activerecord (3.0.5) lib/active_record/connection_adapters/abstract/query_cache.rb:28:in `cache'
      activerecord (3.0.5) lib/active_record/query_cache.rb:12:in `cache'
      activerecord (3.0.5) lib/active_record/query_cache.rb:31:in `call'
      activerecord (3.0.5) lib/active_record/connection_adapters/abstract/connection_pool.rb:354:in `call'
      actionpack (3.0.5) lib/action_dispatch/middleware/callbacks.rb:46:in `block in call'
      activesupport (3.0.5) lib/active_support/callbacks.rb:415:in `_run_call_callbacks'
      actionpack (3.0.5) lib/action_dispatch/middleware/callbacks.rb:44:in `call'
      rack (1.2.1) lib/rack/sendfile.rb:107:in `call'
      actionpack (3.0.5) lib/action_dispatch/middleware/remote_ip.rb:48:in `call'
      actionpack (3.0.5) lib/action_dispatch/middleware/show_exceptions.rb:47:in `call'
      railties (3.0.5) lib/rails/rack/logger.rb:13:in `call'
      rack (1.2.1) lib/rack/runtime.rb:17:in `call'
      activesupport (3.0.5) lib/active_support/cache/strategy/local_cache.rb:72:in `call'
      rack (1.2.1) lib/rack/lock.rb:11:in `block in call'
      <internal:prelude>:10:in `synchronize'
      rack (1.2.1) lib/rack/lock.rb:11:in `call'
      actionpack (3.0.5) lib/action_dispatch/middleware/static.rb:30:in `call'
      railties (3.0.5) lib/rails/application.rb:168:in `call'
      railties (3.0.5) lib/rails/application.rb:77:in `method_missing'
      railties (3.0.5) lib/rails/rack/log_tailer.rb:14:in `call'
      rack (1.2.1) lib/rack/content_length.rb:13:in `call'
      rack (1.2.1) lib/rack/chunked.rb:15:in `call'
      rack (1.2.1) lib/rack/handler/mongrel.rb:67:in `process'
      mongrel (1.2.0.pre2) lib/mongrel.rb:165:in `block in process_client'
      mongrel (1.2.0.pre2) lib/mongrel.rb:164:in `each'
      mongrel (1.2.0.pre2) lib/mongrel.rb:164:in `process_client'
      mongrel (1.2.0.pre2) lib/mongrel.rb:291:in `block (2 levels) in run'

Мои жемчужины:

        Using rake (0.8.7) 
        Using RedCloth (4.2.2) 
        Using abstract (1.0.0) 
        Using activesupport (3.0.5) 
        Using builder (2.1.2) 
        Using i18n (0.5.0) 
        Using activemodel (3.0.5) 
        Using erubis (2.6.6) 
        Using rack (1.2.1) 
        Using rack-mount (0.6.13) 
        Using rack-test (0.5.7) 
        Using tzinfo (0.3.24) 
        Using actionpack (3.0.5) 
        Using mime-types (1.16) 
        Using polyglot (0.3.1) 
        Using treetop (1.4.9) 
        Using mail (2.2.15) 
        Using actionmailer (3.0.5) 
        Using arel (2.0.9) 
        Using activerecord (3.0.5) 
        Using activeresource (3.0.5) 
        Using authlogic (2.1.6) 
        Using xml-simple (1.0.14) 
        Using aws-s3 (0.6.2) 
        Using block_helpers (0.3.3) 
        Using bundler (1.0.10) 
        Using diff-lcs (1.1.2) 
        Using json (1.4.6) 
        Using gherkin (2.3.4) 
        Using term-ansicolor (1.0.5) 
        Using cucumber (0.10.0) 
        Using cucumber-rails (0.3.2) 
        Using daemons (1.0.10) 
        Using database_cleaner (0.6.5) 
        Using factory_girl (1.3.3) 
        Using faker (0.9.5) 
        Using formtastic (1.2.3) 
        Using gem_plugin (0.2.3) 
        Using haml (3.0.25) 
        Using thor (0.14.6) 
        Using railties (3.0.5) 
        Using rails (3.0.5) 
        Using kaminari (0.10.4) 
        Using mongrel (1.2.0.pre2) 
        Using mysql2 (0.2.6) 
        Using nokogiri (1.4.4) 
        Using paperclip (2.3.8) 
        Using rspec-core (2.5.1) 
        Using rspec-expectations (2.5.0) 
        Using rspec-mocks (2.5.0) 
        Using rspec (2.5.0) 
        Using yard (0.6.4) 
        Using pickle (0.4.4) 
        Using populator (1.0.0) 
        Using rspec-rails (2.5.0) 
        Using webrat (0.7.3) 

person Michael Koper    schedule 12.03.2011    source источник
comment
Использует ли ваше приложение кодировку по умолчанию «UTF-8» или «ASCII-8BIT». Кроме того, вы получаете эту ошибку, если у вас нет флэш-сообщений?   -  person Pan Thomakos    schedule 13.03.2011
comment
Я решил это так: stackoverflow.com/questions/11478316/   -  person mvlwn    schedule 24.05.2013
comment
Просто оставьте комментарий: я отредактировал файл с помощью TextEdit, и он изменил == ›'‹ == на == ›` ‹==: затем он выдал эту ошибку. Не используйте TextEdit для кучи мусора   -  person Rambatino    schedule 01.11.2014


Ответы (18)


У меня есть подозрение, что вы либо скопировали / вставили часть своего шаблона Haml в файл, либо вы работаете с редактором, не поддерживающим Unicode / UTF-8.

Посмотрите, сможете ли вы воссоздать этот файл с нуля в удобном для UTF-8 редакторе. Есть много вариантов для любой платформы, и посмотрите, решит ли это вашу проблему. Начните с удаления строки с #content и повторного ввода вручную.

person Vlad Gurovich    schedule 12.03.2011
comment
Спасибо за вашу команду. У меня действительно недействительный персонаж. У меня в тексте была ''. Это было очень сложно, потому что строка ошибки была другой. Спасибо за Ваш ответ! - person Michael Koper; 13.03.2011

Я решил это, выполнив следующие действия:

  • Убедитесь, что config.encoding = "utf-8" находится в файле application.rb.
  • Убедитесь, что вы используете гем mysql2.
  • Поместите # encoding: utf-8 в начало файла, содержащего символы UTF-8.
  • Над строкой <App Name>::Application.initialize! в файле environment.rb добавьте следующие две строки:

    Encoding.default_external = Encoding::UTF_8
    Encoding.default_internal = Encoding::UTF_8
    

http://rorguide.blogspot.com/2011/06/incompatible-character-encodings-ascii.html

person Ritesh Kumar    schedule 02.08.2011
comment
Использование mysql2 отлично сработало, спасибо! - Поменяйте адаптер в database.yml на mysql2 тоже! - person pex; 07.12.2011
comment
Мне пришлось использовать gem 'mysql2', '‹0.3', как предлагается здесь: stackoverflow.com/questions/5840742/ - person marimaf; 10.05.2012
comment
отредактируйте config / database.yml, измените адаптер mysql на mysql2, тогда он будет работать! - person Tim Wong; 27.10.2014
comment
Также обратите внимание, что Encoding.default_external = Encoding::UTF_8, похоже, не относится к рубиновым файлам в папке /lib. Добавление # encoding: utf-8 поверх каждого файла помогло мне! - person Augustin Riedinger; 16.06.2015

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

title.to_s.force_encoding («UTF-8»)

person mfq    schedule 14.02.2012
comment
Кажется, есть некоторые функции даже в стандартном рубине, которые, кажется, вызывают это. Для меня это был Digest :: MD5.digest (Random.rand (10000) .to_s) - person Smar; 10.12.2012
comment
При переходе с rails 4.2.8 на 4.2.9 puts "debug URL is #{request.fullpath}" в контроллере вызывало ошибку, переход на request.fullpath.inspect решил ее. - person jpw; 16.07.2017

ASCII-8BIT - это описание Ruby для символов выше обычного набора символов 0-0x7f ASCII, и это однобайтовые символы. Обычно это что-то вроде ISO-8859-1 или одного из его братьев и сестер.

Если вы можете определить, какой символ вызывает проблему, вы можете указать Ruby 1.9.2 преобразовать набор символов этого символа в UTF-8.

Джеймс Грей написал серию блогов, рассказывая о подобных проблемах и способах их решения. Я бы порекомендовал их пройти.

несовместимые кодировки символов: ASCII-8BIT и UTF-8

Обычно это происходит из-за того, что вы пытаетесь объединить две строки, одна из которых содержит символы, которые не соответствуют набору символов другой строки. В ISO-8859-1 есть символы, которые не имеют эквивалентов в UTF-8, и наоборот, и то, как обрабатывать соединение строк с этими несовместимостями, требует вмешательства программиста.

person the Tin Man    schedule 13.03.2011
comment
Описание Ruby для ISO-8859-1 - ISO-8859-1. ASCII-8BIT - это рубиновое описание двоичных данных. - person sepp2k; 13.03.2011

вы можете принудительно использовать UTF8 с помощью force_encoding(Encoding::UTF_8):

Пример:

<%= yield.force_encoding(Encoding::UTF_8) %>
person Daniel Loureiro    schedule 20.04.2015

Для Haml добавьте подсказку по кодировке:

-# coding: UTF-8

в верхнем левом углу страницы Haml.

person umitka    schedule 02.05.2012

Я установил gem-пакет mysql2.

gem install mysql2

а затем я изменил адаптер в mysql2 в database.yml.

person StandDuPp    schedule 13.06.2013
comment
Ой, да, рок-н-ролл, мой жареный, здесь сработало! : D - person ; 30.01.2017

Проблема заключалась в использовании неправильных кавычек вокруг версии iOS. Убедитесь, что все цитаты написаны как «или», а не «или».

https://github.com/CocoaPods/CocoaPods/issues/829

person Yllow    schedule 18.02.2014

Для предотвращения ошибки «не удается изменить замороженную строку» для кодирования переменной вы можете использовать: var.dup.force_encoding(Encoding::ASCII_8BIT) или var.dup.force_encoding(Encoding::UTF_8)

person DarkAiR    schedule 19.04.2017

У меня была аналогичная проблема. Хотя у меня были решены кодировки UTF-8 (с mysql2 и Encoding.default_external = Encoding :: UTF_8 ...) несовместимые кодировки символов: UTF-8 и ASCII-8BIT возникали, когда я использовал неправильные параметры помощника например f.button :submit, "Zrušiť" - работает отлично, но f.button "Zrušiť"- выдает ошибку кодирования.

person remo    schedule 25.01.2012

Я столкнулся с ошибкой при переносе приложения с Ruby 1.8.7 на 1.9.3, и она возникла только в рабочей среде. Оказалось, что в моем магазине Memcache остались кое-какие остатки. Теперь чувствительная к кодированию версия Ruby 1.9.3 моего приложения попыталась смешать старые значения ASCII-8BIT с новым UTF-8.

Это было так же просто, как очистить кеш, чтобы исправить это для меня.

person Carsten    schedule 31.08.2013

У меня была аналогичная проблема с пользовательским файлом CoffeeScript. Я решил это, изменив кодировку конечной строки с «Unix / Linux» на «Mac OS Classic»

person Sidhannowe    schedule 10.09.2012

Создание pdf-документов с rails-latex-gem приводит к аналогичной проблеме. Я решил это, изменив layouts/application.pdf.erb на

\begin{document}

<%= yield.force_encoding("UTF-8") %>


\end{document}
person hartmut    schedule 16.02.2013

очень странно, что я столкнулся с этой проблемой, потому что я забыл указать параметр type. например.:

add_column :cms_push_msgs, :android_title

который должен быть:

add_column :cms_push_msgs, :android_content, :string 
person Siwei    schedule 28.05.2013

Для справки: для меня оказалось, что это гем под названием 'mysql' ... очевидно, он по умолчанию работает с US-ASCII 8 бит. Таким образом, изменение его на драгоценный камень под названием mysql2 (2 - важный момент здесь) решило все мои проблемы.

Я посмотрел @ список драгоценных камней, опубликованный выше - Майкл Копер, очевидно, установил mysql2, но я опубликовал это на случай, если у кого-то есть эта проблема ... (мне потребовалось некоторое время, чтобы выяснить).

Если вам не нравится этот ответ, прокомментируйте, и я удалю его.

P.S: немецкие умляуты (ä, ö и ü) облажались с помощью mysql

person Langusten Gustel    schedule 26.09.2013
comment
Обязательно переключите mysql на mysql2 в Gemfile и database.yml - person atomiccoder; 26.08.2014

У меня была такая же проблема при разборе файлов CSV на Ruby 1.9.2, которые были правильно проанализированы на Ruby 1.8. Я нашел ответ здесь. При открытии файла CSV с помощью модуля Ruby CSV необходимо указать кодировку UTF-8 следующим образом:

CSV.foreach("file.txt", encoding: "UTF-8") do |row|
   # foo and bar correctly encoded
   foo, bar, ... = row
end
person Eduardo    schedule 02.01.2014

У меня была похожая проблема, и очиститель ниток драгоценных камней автоматически исправил ее для меня. https://github.com/hsbt/string-scrub Если данная строка содержит недопустимый байт sequence, затем эта недопустимая последовательность байтов заменяется символом замены Unicode (�), и возвращается новая строка.

person dabobert    schedule 14.07.2014

Я получил такое же загадочное сообщение об ошибке от Rails 4.1, Ruby 2.3.3 в недавнем проекте, stacktrace происходит из layout application.html.haml

После безумной погони виновником стал символ UTF-8, который недавно был добавлен в нижний колонтитул всех страниц. По какой-то странной причине ошибка появлялась только периодически.

Замена символа UTF-8 соответствующей escape-последовательностью HTML &#xHHHH; решила проблему.

Я надеюсь, что это сэкономит время другим людям в будущем ..

person Tilo    schedule 21.02.2017