Wenn Sie nur mit den rohen Bytes arbeiten möchten, können Sie versuchen, es als ASCII-8BIT/BINARY zu kodieren.
str.force_encoding("BINARY").split("n")
Dies ist nicht Ihre ü zurück aber in Gang zu bringen, da Ihre Quellzeichenfolge in diesem Fall ist ISO-8859-1 (oder so ähnlich):
"- Men\xFC -".force_encoding("ISO-8859-1").encode("UTF-8")
=> "- Menü -"
Wenn Sie möchten, Um Multibyte-Zeichen zu erhalten, müssen Sie wissen, was der Quellzeichensatz ist. Sobald Sie force_encoding
zu BINARY, werden Sie buchstäblich nur die rohen Bytes haben, so Multibyte-Zeichen werden nicht entsprechend interpretiert werden.
Wenn die Daten aus Ihrer Datenbank stammen, können Sie den Verbindungsmechanismus ändern, um eine ASCII-8BIT- oder BINARY-Codierung zu verwenden. Ruby sollte dann entsprechend kennzeichnen. Alternativ können Sie den Datenbanktreiber so einstellen, dass die Codierung für alle gelesenen Zeichenfolgen erzwungen wird. Dies ist jedoch ein massiver Hammer und könnte absolut falsch sein.
Die richtige Antwort wird sein, Ihre String-Codierungen zu beheben. Dies kann eine Datenbankkorrektur, eine Datenbanktreiber-Verbindungscodierungskorrektur oder eine Kombination daraus erfordern. Alle Bytes sind noch da, aber wenn Sie mit einem bestimmten Zeichensatz zu tun haben, sollten Sie, wenn irgend möglich, Ruby wissen lassen, dass Sie erwarten, dass Ihre Daten in dieser Kodierung sind. Ein häufiger Fehler besteht darin, den mysql2-Treiber zu verwenden, um eine Verbindung zu einer MySQL-Datenbank herzustellen, die Daten in latin1-Kodierungen enthält, aber einen utf-8-Zeichensatz für die Verbindung anzugeben. Dies führt dazu, dass Rails die latin1-Daten aus der DB übernimmt und sie als utf-8 interpretiert, anstatt sie als latin1 zu interpretieren, die Sie dann in UTF-8 konvertieren können.
Wenn Sie näher erläutern können, woher die Strings kommen, ist möglicherweise eine vollständigere Antwort möglich. Sie können auch this answer für eine mögliche globale (-ish) Rails-Lösung für Standard-Zeichenkodierungen auschecken.
Zeigen Sie einige Beispiele der ungültigen Daten an. Wie lautet die Codierung in Ihrer Datenbank oder in Ihren Tabellen? Rails muss dem entsprechen. Data Rails empfängt muss zu der gleichen Codierung gezwungen werden, die die Datenbank speichert, andernfalls müssen Sie die binäre <--> ASCII- oder binäre <--> UTF-8-Codierung verwenden. –
@fotanus: Es hat mit Ruby 1.8 funktioniert, weil Ruby 1.8 die Codierung nicht auf die gleiche Weise behandelt hat (tatsächlich überhaupt). Siehe z.B.http://yokolet.blogspot.com/2009/07/design-and-implementation-of-ruby-m17n.html und http://yehudakatz.com/2010/05/05/ruby-1-9-encodings- a-primer-and-the-solution-for-rails/ –
@Denis, ich bin mir bewusst, dass es sich geändert hat, deshalb kämpfe ich gegen dieses Problem. – fotanus