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.
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
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.
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
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.
[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