2012-12-11 3 views
13

Po uruchomieniu rake test, za każdym razem otrzymuję komunikat o błędzie.Test prowizji i błąd: zapisywanie dziennika nie powiodło się. " xE2" od ASCII-8BIT do UTF-8

log writing failed. "\xE2" from ASCII-8BIT to UTF-8 

Proszę o poradę w tej sprawie. Jak usunąć ten błąd.

+0

Hmm, co jest wykonywanie tego zapisu dziennika w backtrace? Myślę, że pierwsze pytanie polega na ustaleniu, czy wartość "\ xE2" jest tworzona w pamięci przez twój kod, utrzymywana i odpytywana z bazy danych lub tworzona przez framework. –

Odpowiedz

16

Prawdopodobnie masz gdzieś w swoim kodzie próbę wyprowadzenia łańcucha, którego kodowanie jest nieprawidłowe lub ma jakieś dziwne znaki, a kodowanie nie działa.

Prawidłowy sposób polega na znalezieniu łańcucha powodującego problemy i ustaleniu przyczyny błędnego kodowania. Zobacz kodowanie i force_encoding w api string (http://ruby-doc.org/core-2.2.0/String.html).

Jeśli chcesz tylko móc wydrukować ten wiersz w dzienniku i uniknąć błędu, możesz wykonać następującą procedurę z tym ciągiem.

str = 'here is some string with wrong encoding and funny characters e.g. "\xE2"' 
# note if you do this in console, the str is encoded correctly 

# Rails.logger.info(str) # this would result in the error line 

# This will change the encoding and remove weird characters 
str = str.encode('utf-8', :invalid => :replace, :undef => :replace, :replace => '_') 

Rails.logger.info(str) # this now works 
+0

Link do Rubydoc to 404. – ablarg

+0

@holli, to pierwsze zadanie 'str' nie jest całkiem poprawne. Ponieważ używasz pojedynczych cudzysłowów do konstrukcji łańcuchów, '\ x' nie jest przestrzegane. Twój przykład musi zostać zaktualizowany, aby był: 'str =" tutaj jest ciąg znaków z nieprawidłowym kodowaniem i zabawnymi znakami, np. \ XE2 "' iw ten sposób możesz poprawnie odtworzyć problem w konsoli Rails. Kiedy używam podwójnych cudzysłowów do przypisania i nie wołam '.encode', mogę teraz poprawnie odtworzyć błąd, który wygląda tak:" ArgumentError: niepoprawna sekwencja bajtów w UTF-8 ". – stwr667

4

Czy używasz postgresql? Twoja baza danych może używać SQL_ASCII. Możesz to sprawdzić, uruchamiając psql template1 -c 'show server_encoding' Usuń klaster bazy danych i ponownie zainicjuj go za pomocą initdb -E utf8 /path/to/database.

+0

ponieważ jest to prawdopodobnie Railsy, ​​nie zapomnij, że możesz uzyskać dostęp do bazy danych bezpośrednio za pomocą db db, a następnie po prostu wpisując 'show server_encoding; "sans oczywiście cytuje. – engineerDave

1

W moim przypadku niektóre dziwne cudzysłów były winowajcą więc po prostu wymienić je z bezpiecznych znaków takich jak ta,

msg = error.message.gsub(/[“”]/, "\"").gsub(/[‘’]/,"\'")