2010-07-11 11 views
6

sto cercando di migrare un'applicazione Sinatra per Ruby 1.9Ruby 1.9 + Sinatra codifiche dei caratteri incompatibili: ASCII-8 bit e UTF-8

sto usando Sinatra 1.0, 1.2.0 e cremagliera erb modelli

quando inizio Sinatra funziona, ma quando chiedo la pagina web dal browser ottengo questo errore:

Encoding::CompatibilityError at/
incompatible character encodings: ASCII-8BIT and UTF-8 

tutti i file .RB ha questa intestazione:

#!/usr/bin/env ruby 
# encoding: utf-8 

Credo che il problema è nei file erb anche se si dimostra che si tratta di codifica UTF-8

[[email protected] views]$ file home.erb 
home.erb: UTF-8 Unicode text 

qualcuno ha avuto questo problema prima? è sinatra non completamente compatibile con Ruby 1.9?

+0

Provare a modificare temporaneamente i file solo in ascii. – Adrian

+1

il problema è che ho bisogno di usare i noleggiatori utf-8 nei modelli. – John

+0

Se si utilizza HTML, è necessario sostituirli con entità. Altrimenti, potresti provare a toglierli temporaneamente solo per vedere se sono il problema. – Adrian

risposta

15

Non ho familiarità con le specifiche della situazione, ma questo tipo di errore si è verificato in Ruby 1.9 quando si tenta di concatenare una stringa nel codice sorgente (tipicamente codificata in UTF-8) con una stringa dall'esterno del sistema, ad esempio, l'input da un modulo HTML o dati da un database.

ASCII-8BIT è fondamentalmente un sinonimo di binario. Suggerisce che la stringa di input non è stata taggata con la codifica effettiva che è stata utilizzata (ad esempio, UTF-8 o ISO-8859-1).

La mia comprensione è che i messaggi di eccezione non sono visualizzati in Ruby 1.8 perché tratta le stringhe come binarie e concatena in silenzio stringhe di codifiche diverse. Per ragioni sottili, questo spesso non è un problema.

Ho avuto un errore simile ieri e ho trovato questa eccellente panoramica.

Una possibilità per ottenere il vostro messaggio di errore di andare via è quella di utilizzare force_encoding ('UTF-8') (o qualche altra codifica) sulla stringa proveniente dalla sorgente esterna. Questo non deve essere fatto alla leggera e vorresti avere un senso delle implicazioni.

0

Ho avuto lo stesso problema. Il problema era un file codificato utf8 che dovrebbe essere noi-ascii.

ho controllato utilizzando il comando file (su OSX):

$ file --mime-encoding somefile 
somefile: utf-8 

Dopo aver rimosso i caratteri strani dal file:

$ file --mime-encoding somefile 
somefile: us-ascii 

Questo risolto il problema per me.

Problemi correlati