Inkompatible Zeichenkodierungen: ASCII-8BIT und UTF-8


72

Ich benutze Ruby 1.9.2 und Rails 3.0.5

Ich habe folgenden Fehler:

Inkompatible Zeichenkodierungen: ASCII-8BIT und UTF-8

Es hat nichts mit der Datenbank zu tun, denke ich.

Der Fehler tritt in dieser Zeile in einer Ansicht auf (nur ein div haml-Aufruf):

#content

voller Stapel:

    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'

Meine Edelsteine:

        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) 

Verwendet Ihre Anwendung 'UTF-8' oder 'ASCII-8BIT' als Standardcodierung? Erhalten Sie diesen Fehler auch, wenn Sie keine Flash-Nachrichten haben?
Pan Thomakos


Einfach einen Kommentar hinterlassen: Ich habe eine Datei mit TextEdit bearbeitet und sie hat ==> '<== in ==> `<== geändert: Dann wurde dieser Fehler ausgegeben. Verwenden Sie nicht TextEdit den Müllhaufen
Rambatino

Antworten:


16

Ich habe den Verdacht, dass Sie entweder einen Teil Ihrer Haml-Vorlage in die Datei kopiert / eingefügt haben oder mit einem nicht Unicode / nicht UTF-8-freundlichen Editor arbeiten.

Überprüfen Sie, ob Sie diese Datei in einem UTF-8-freundlichen Editor von Grund auf neu erstellen können. Es gibt genug für jede Plattform und sehen Sie, ob dies Ihr Problem behebt. Beginnen Sie, indem Sie die Zeile mit #contentlöschen und manuell erneut eingeben.


Danke für deinen Befehl. Ich hatte tatsächlich einen ungültigen Charakter. Ich hatte ein 'im Text. Es war sehr schwierig, weil die Fehlerzeile nicht dieselbe war. Danke für deine Antwort!
Michael Koper

63

Ich habe es folgendermaßen gelöst:

  • Stellen Sie sicher, dass config.encoding = "utf-8"es sich in der Datei application.rb befindet.
  • Stellen Sie sicher, dass Sie den Edelstein 'mysql2' verwenden.
  • Fügen Sie # encoding: utf-8den Anfang der Datei mit UTF-8-Zeichen ein.
  • Fügen Sie über der <App Name>::Application.initialize!Zeile in der Datei environment.rb die folgenden zwei Zeilen hinzu:

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

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


16
Die Verwendung mysql2hat bei mir gut funktioniert, danke! - Ändern Sie den Adapter in database.ymlan , mysql2wie gut!
Pex

2
Ich musste den Edelstein 'mysql2', '<0.3' verwenden, wie hier vorgeschlagen: stackoverflow.com/questions/5840742/…
marimaf

1
edit config / database.yml, ändere den Adapter 'mysql' in 'mysql2' dann funktioniert es!
Tim Wong

Beachten Sie auch, dass Encoding.default_external = Encoding::UTF_8dies nicht für Ruby-Dateien im /libOrdner gilt. Das Hinzufügen # encoding: utf-8zu jeder Datei dort hat den Trick für mich getan!
Augustin Riedinger

47

Versuchen Sie, die genaue Zeile zu finden, die dieses Problem verursacht, und erzwingen Sie dann die UTF8-Codierung. Diese Lösung hat bei mir funktioniert.

title.to_s.force_encoding ("UTF-8")


8
Es scheint sogar in Standard-Rubin einige Funktionen zu geben, die dies zu verursachen scheinen. Für mich war es Digest :: MD5.digest (Random.rand (10000) .to_s)
Smar

Beim Umschalten von den Schienen 4.2.8 auf 4.2.9 puts "debug URL is #{request.fullpath}"in einer Steuerung wurde der Fehler durch Ändern in request.fullpath.inspect behoben.
jpw

11

ASCII-8BIT ist Rubys Beschreibung für Zeichen, die über dem normalen 0-0x7f-ASCII-Zeichensatz liegen und Einzelbytezeichen sind. Normalerweise ist das so etwas wie ISO-8859-1 oder eines seiner Geschwister.

Wenn Sie feststellen können, welches Zeichen das Problem verursacht, können Sie Ruby 1.9.2 anweisen, zwischen dem Zeichensatz dieses Zeichens und UTF-8 zu konvertieren.

James Gray schrieb eine Reihe von Blogs über diese Art von Problemen und wie man damit umgeht. Ich würde empfehlen, sie durchzugehen.

Inkompatible Zeichenkodierungen: ASCII-8BIT und UTF-8

Dies geschieht normalerweise, weil Sie versuchen, zwei Zeichenfolgen zu verketten, und eine Zeichen enthält, die nicht dem Zeichensatz der anderen Zeichenfolge zugeordnet sind. Es gibt Zeichen in ISO-8859-1, die in UTF-8 keine Entsprechungen haben, und umgekehrt. Um mit dem Verbinden von Zeichenfolgen mit diesen Inkompatibilitäten umzugehen, muss der Programmierer eingreifen.


2
Rubys Beschreibung für ISO-8859-1 lautet "ISO-8859-1". "ASCII-8BIT" ist Rubys Beschreibung für Binärdaten.
sepp2k

9

Sie können UTF8 erzwingen mit force_encoding(Encoding::UTF_8):

Beispiel:

<%= yield.force_encoding(Encoding::UTF_8) %>

7

Für Haml einen Kodierungshinweis einfügen:

-# coding: UTF-8

oben links auf der Haml-Seite.


5

Ich habe das Gem-Paket mysql2 installiert.

gem install mysql2

und dann habe ich den Adapter in mysql2 in database.yml geändert.


Aww yeahh Rock'n'Roll mein gebratenes es hat hier funktioniert! : D


3

Um zu verhindern, dass ein Fehler "Gefrorene Zeichenfolge kann nicht geändert werden" zum Codieren einer Variablen verwendet wird, können Sie Folgendes verwenden: var.dup.force_encoding(Encoding::ASCII_8BIT)odervar.dup.force_encoding(Encoding::UTF_8)


2

Ich habe ein ähnliches Problem erlebt. Obwohl ich UTF-8-Codierungen gelöst hatte (mit mysql2 und Encoding.default_external = Encoding :: UTF_8 ...), entstanden inkompatible Zeichencodierungen: UTF-8 und ASCII-8BIT entstanden, wenn ich falsche Hilfsparameter verwendete, z. B. f.button :submit, "Zrušiť"- funktioniert perfekt, aber f.button "Zrušiť"- wirft Codierungsfehler.


2

Beim Migrieren einer App von Ruby 1.8.7 auf 1.9.3 ist der Fehler aufgetreten, der nur in der Produktion aufgetreten ist. Es stellte sich heraus, dass ich einige Reste in meinem Memcache-Laden hatte. Die jetzt codierende Ruby 1.9.3-Version meiner App hat versucht, alte ASCII-8BIT-Werte mit neuem UTF-8 zu mischen.

Es war so einfach wie das Leeren des Caches, um es für mich zu reparieren.


0

Ich hatte ein ähnliches Problem mit einer benutzerdefinierten CoffeeScript-Datei. Ich habe es gelöst, indem ich die Endline-Codierung von "Unix / Linux" auf "Mac OS Classic" geändert habe.


0

Die Erstellung von PDF-Dokumenten rails-latex-gemführt zu einem ähnlichen Problem. Ich habe dies durch Modifizieren layouts/application.pdf.erbauf gelöst

\begin{document}

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


\end{document}

0

Es ist sehr seltsam, dass ich auf dieses Problem gestoßen bin, weil ich vergessen habe, den Parameter 'type' anzugeben. z.B:

add_column :cms_push_msgs, :android_title

welches sein sollte:

add_column :cms_push_msgs, :android_content, :string 

0

Nur zur Veranschaulichung: Für mich stellte sich heraus, dass es sich um das Juwel 'mysql' handelte ... offensichtlich funktioniert dies standardmäßig mit US-ASCII 8 Bit . Das Ändern in den Edelstein mysql2 (die 2 ist hier der wichtige Punkt) löste alle meine Probleme.

Ich habe in der oben angegebenen Edelsteinliste nachgesehen - Michael Koper hat offensichtlich mysql2 installiert, aber ich habe dies gepostet, falls auch jemand dieses Problem hat. (Ich habe einige Zeit gebraucht, um es herauszufinden).

Wenn Ihnen diese Antwort nicht gefällt, kommentieren Sie sie bitte und ich werde sie löschen.

PS: Deutsche Umlaute (ä, ö und ü) haben es mit MySQL herausgeschraubt


Stellen Sie sicher, dass Sie MySQL auf MySQL in Gemfile und database.yml
umschalten

0

Ich hatte das gleiche Problem beim Parsen von CSV-Dateien unter Ruby 1.9.2, die unter Ruby 1.8 korrekt analysiert wurden. Ich habe die Antwort hier gefunden . Wenn Sie die CSV-Datei mit dem Ruby CSV-Modul öffnen, müssen Sie die UTF-8-Codierung wie folgt angeben:

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

0

Ich hatte ein ähnliches Problem und das Edelstein-String-Scrub hat es automatisch für mich behoben. https://github.com/hsbt/string-scrub Wenn die angegebene Zeichenfolge eine ungültige Bytesequenz enthält, wird diese ungültige Bytesequenz durch das Unicode-Ersetzungszeichen ( ) ersetzt und eine neue Zeichenfolge zurückgegeben.


0

Ich habe die gleiche kryptische Fehlermeldung von Rails 4.1, Ruby 2.3.3 in einem kürzlich durchgeführten Projekt erhalten. Stacktrace stammt aus dem Layout application.html.haml

Nach einer wilden Gänsejagd war der Täter ein UTF-8-Charakter, der kürzlich in die Fußzeile aller Seiten aufgenommen wurde. Aus irgendeinem seltsamen Grund würde der Fehler nur zeitweise auftreten.

Das Ersetzen des UTF-8-Zeichens durch die entsprechende HTML-Escape-Sequenz &#xHHHH; löste das Problem.

Ich hoffe, das spart anderen Menschen in Zukunft etwas Zeit.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.