Eine Geschichte über das Konvertieren von Zeichencodes von UTF-8 in Shift-jis in Ruby

Eine Geschichte über das Konvertieren von Zeichencodes von UTF-8 in Shift-jis in Ruby

Ich wurde gebeten, den Standardzeichencode der Zeichenfolge auf Shift-jis zu setzen, wenn ich in meinem aktuellen Job CSV ausspucke.

Der Standardzeichencode für Ruby-Zeichenfolgen ist UTF-8, daher dachte ich, dass dies möglich wäre, indem ich ihn beim Entladen von CSV einfach in Shift-jis konvertiere, aber ich war süchtig danach.

Einige Leute sind vielleicht auch süchtig danach, deshalb werde ich die Lösung beschreiben.

Süchtig machender Montageort

Der CSV-Auswurf kann relativ einfach mithilfe der Erzeugungsmethode der CSV-Klasse der Ruby-Bibliothek implementiert werden.

Implementierungsimage ↓

require "csv"

text =<<-EOS
id,first name,last name,age
1,taro,tanaka,20
2,jiro,suzuki,18
3,ami,sato,19
4,yumi,adachi,21
EOS

csv = CSV.generate(text, headers: true) do |csv|
  csv.add_row(["5", "saburo", "kondo", "34"])
end

Code-Referenz: https://docs.ruby-lang.org/ja/latest/method/CSV/s/generate.html

Wenn Sie in Shift-Jis konvertieren möchten, können Sie die Ausgabecodierung mit dem Schlüssel: encoding angeben.

CSV.generate(text, headers: true, encoding: "SJIS")

Mit dieser Option wird die Ausgabecodierung automatisch von utf-8 in shift-jis konvertiert.

Als ich es hier implementiert habe, ist aus irgendeinem Grund der folgende Fehler aufgetreten .....

incompatible character encodings: Windows-31J and UTF-8

Ursachenforschung

Untersuchen Sie, warum Sie einen Codierungsfehler erhalten.

Als Ergebnis der Untersuchung, welche Zeichenfolge einen Fehler verursacht, ist in der folgenden Zeichenfolge ein Fehler aufgetreten.

"AAA−0001"

Es ist eine Zeichenfolge, die sich nicht seltsam anfühlt. Warum ist es ein Fehler?

Bei näherer Betrachtung scheint die Konvertierung der folgenden Zeichen in shif-jis zu einem Ausnahmefehler zu führen.

Zeichencode (UTF-8) Brief Bemerkungen
U+00A2 ¢ Cent-Symbol (Währung)
U+00A3 £ Pfundsymbol (Währung)
U+00AC ¬ NICHT Symbol
U+2016 Double vertical line
U+2212 Minuszeichen
U+301C Wellenschlag

Referenz: https://osa.hatenablog.com/entry/2014/08/21/113602

"AAA−0001"

Da diese Zeichenfolge- (Minuszeichen) enthält, wird angenommen, dass ein Ausnahmefehler aufgetreten ist.

Lösungen

Ich verstehe die Ursache des Fehlers. Wie lösen Sie es?

Am einfachsten ist es, die Zeichenfolgenklasse mit Rubys offenen Klassen zu erweitern.

Ruby hat keine Einschränkungen hinsichtlich der Klassenvererbung. Selbst integrierte Bibliotheksklassen wie die String-Klasse und die Array-Klasse können vererbt werden, um ihre eigenen Klassen zu definieren.

Fügen Sie der String-Klasse daher eine Methode hinzu, um Ausnahmen bei der Konvertierung in Windows-31J zu vermeiden (siehe unten).

class String
  def sjisable
    str = self
    #Ersetzen Sie die Zeichen in der Konvertierungstabelle durch die folgenden Zeichen
    from_chr = "\u{301C 2212 00A2 00A3 00AC 2013 2014 2016 203E 00A0 00F8 203A}"
    to_chr   = "\u{FF5E FF0D FFE0 FFE1 FFE2 FF0D 2015 2225 FFE3 0020 03A6 3009}"
    str.tr!(from_chr, to_chr)
    #Aus der Konvertierungstabelle sind illegale Zeichen durchgesickert?Konvertieren Sie zu und dann zurück zu UTF8, um zukünftige Ausnahmen zu vermeiden
    str = str.encode("Windows-31J","UTF-8",:invalid => :replace,:undef=>:replace).encode("UTF-8","Windows-31J")
  end
end

Code-Referenz: https://qiita.com/yugo-yamamoto/items/0c12488447cb8c2fc018

Wenn Sie diese Methode an der Stelle ausführen, an der ein Ausnahmefehler auftritt, tritt der Ausnahmefehler nicht auf.

"AAA−0001".sjisable

Wenn Sie keine offene Klasse verwenden möchten

Offene Klassen und sind sehr leistungsfähig und können zur Verbesserung der Entwicklungseffizienz verwendet werden.

Auf der anderen Seite ist es schön, der Ruby-Standardklasse eine eindeutige Methode hinzuzufügen, aber selbst wenn Sie den Code lesen, können Sie nicht sagen, wer die Methode wo und zu welchem Zweck definiert hat, und stattdessen die Entwicklungseffizienz des gesamten Teams verbessern. Lass es fallen.

Ein weiterer möglicher Nachteil besteht darin, dass ein Fehler zu einem unerwarteten Zeitpunkt auftritt.

Oder liegt es in der Verantwortung der String-Klasse, den Zeichencode für einige Personen in Shift_JIS zu ändern, oder liegt es in der Verantwortung der Klasse, die CSV verarbeitet, da dies bei der Konvertierung in CSV erforderlich ist? Ich denke, es wird eine Frage geben.

Wenn Sie die offene Klasse nicht verwenden, ist es besser, eine CsvUtility-Klasse zu erstellen, die Prozeduren für die Behandlung von CSV dort zu konsolidieren und sie so zu implementieren, dass sie als Shift_JIS oder UTF-8 ausgegeben werden kann. Werden.

Referenz

[Junichi Ito. Einführung in Ruby für Profis Von Sprachspezifikationen bis zu testgetriebenen Entwicklungs- / Debugging-Techniken](https://www.amazon.co.jp/dp/B077Q8BXHC/ref=dp-kindle-redirect?_encoding = UTF8 & btkr = 1)

Recommended Posts

Eine Geschichte über das Konvertieren von Zeichencodes von UTF-8 in Shift-jis in Ruby
Wechseln Sie in einem neuen Ruby on Rails-Projekt von SQLite3 zu PostgreSQL
Die Geschichte des Jobwechsels von einem christlichen Pastor (Lehrling) zu einem Webingenieur
Die Geschichte eines arithmetischen Überlaufs, der in Ruby nicht auftreten sollte
Eine Geschichte über den Wechsel von Fähigkeiten von COBOL, das Ende der 20er Jahre 5 Jahre lang gepflegt wurde, zu einer Web-Sprache
Eine Geschichte über das JDK in der Java 11-Ära
Eine sehr nützliche Geschichte über Rubys Struct-Klasse
Die Geschichte des Versuchs, JAVA File zu bedienen
So starten Sie einen Index aus einer beliebigen Zahl in der iterativen Ruby-Verarbeitung
Eine Geschichte über den Versuch, mit Mockito auszukommen
Eine Geschichte über das Bemühen, JAR-Dateien zu dekompilieren
Eine Geschichte über die Reduzierung des Speicherverbrauchs auf 1/100 mit find_in_batches
Ruby regulärer Ausdruck Auszug aus einer bestimmten Zeichenfolge in eine Zeichenfolge
Von Java zu Ruby !!
So ändern Sie eine Zeichenfolge in einem Array in eine Zahl in Ruby
Eine Geschichte über eine BeanNotOfRequiredTypeException, die nach der Anwendung von AOP im Frühjahr aufgetreten ist
So zeigen Sie Diagramme in Ruby on Rails an (LazyHighChart)
Ich möchte eine Parkettdatei auch in Ruby erstellen
Wenden Sie CSS auf eine bestimmte Ansicht in Ruby on Rails an
Über Smart Cast im Rückruf von Fragment zu Aktivität in Kotlin
Eine Geschichte über Missverständnisse im Umgang mit Java-Scannern (Memo)
Informationen zur Methode zum Konvertieren einer Zeichenfolge in eine Ganzzahl / einen Bruch (Umwandlungsdaten) in Java
Multiplikation innerhalb eines Ruby-Arrays
Über reguläre Ausdrücke in Ruby
Ich habe versucht, Code wie eine Typdeklaration in Ruby zu schreiben
Eine Geschichte über die Herstellung eines Taschenrechners zur Berechnung der Muschelhügelrate
Die Geschichte, dass Tomcat in Eclipse unter einem Timeout-Fehler litt
Abrufen und Hinzufügen von Daten aus dem Firebase Firestore in Ruby
Wie man über Klassengestaltung (Division) in einem Geschäftssystem nachdenkt (1)
Eine Geschichte über das Ausführen eines Programms, das Dateien in Java aus einer Bat-Datei kopiert, um die tägliche Arbeit ein wenig effizienter zu gestalten