Ruby: Nokogiri ermittelt automatisch den Zeichencode von HTML, das im Binärmodus gelesen wird

Einführung

Ich las HTML mit Open-Uri, analysierte es mit Nokogiri und kratzte es, aber zu dieser Zeit war es möglich, zu analysieren, ohne verstümmelte Zeichen zu verursachen, selbst wenn ich die Codierung von Nokogiri auf "Null" änderte (oder wegließ). Es war. Beim Lesen von HTML mit open-uri wird es in Binärform gelesen, daher habe ich mich darauf konzentriert, was passiert, wenn in Binärdatei gelesenes HTML mit Nokogiri mit der Codierung "nil" analysiert wird.

Versuchen Sie, die HTML.parse-Codierung auf "nil" zu setzen.

Stellen wir die Codierung ein, wenn wir HTML mit Nokogiri als "Null" analysieren. Setzen Sie nil auf das dritte Argument von HTML.parse. Das folgende HTML wird dieses Mal geladen. Die Datei ist in Shift_JIS geschrieben.

hello.html


<html>
  <head>
    <title>Hallo</title>
    <meta charset="Shift_JIS">
  </head>
  <body>
  </body>
</html>

Laden Sie HTML im Binärmodus. Sie können die Datei binär lesen, indem Sie der offenen Methode die Option "rb" hinzufügen. Lassen Sie uns zur Überprüfung den Zeichencode zum Zeitpunkt des Lesens im Binärmodus und den Zeichencode nach dem Parsen mit Nokogiri anzeigen.

sample.rb


require 'nokogiri'

html = open('hello.html', 'rb').read

p html.encoding
p Nokogiri::HTML.parse(html, nil, nil).encoding

Ausführungsergebnis

sample.rb Ergebnis


$ ruby sample.rb
#<Encoding:ASCII-8BIT>
"Shift_JIS"

Aus dem Ergebnis kann bestätigt werden, dass die Codierung des gelesenen HTML selbst ASCII-8BIT ist, die Codierung nach dem Parsen durch Nokogiri jedoch Shift_JIS ist, was der Originaldatei entspricht. Übrigens, auch wenn Sie das Argument als "HTML.parse (html)" weglassen, können Sie das gleiche Ergebnis wie oben erhalten.

Wo bezieht sich Nokogiri auf den Zeichencode?

Mit Blick auf die obigen Überprüfungsergebnisse verweist Nokogiri selbst auf einen Zeichencode. Wo beziehen Sie sich?

Eigentlich werde ich auf das Meta-Element der ursprünglichen HTML-Datei verweisen. Es bezieht sich auf den Zeichensatz von "".

Versuchen Sie, den Zeichensatzteil auf UTF-8 zu ändern, und geben Sie den Zeichencode auf die gleiche Weise wie zuvor aus.

hello.html


<html>
  <head>
    <title>Hallo</title>
    <meta charset="UTF-8">
  </head>
  <body>
  </body>
</html>

Ausführungsergebnis

sample.rb Ergebnis


$ ruby sample.rb
#<Encoding:ASCII-8BIT>
"UTF-8"

Sie können sehen, dass der Zeichencode nach dem Parsen in UTF-8 geändert wurde.

Übrigens, wenn ich versuche, Zeichensätze zu eliminieren, ...

hello.html


<html>
  <head>
    <title>Hallo</title>
    <meta>
  </head>
  <body>
  </body>
</html>

sample.rb Ergebnis


$ ruby sample.rb
#<Encoding:ASCII-8BIT>
nil

Der Zeichencode nach dem Parsen ist gleich Null geworden. Wenn Sie den Titel usw. in diesem Zustand anzeigen, werden die Zeichen natürlich verstümmelt.

Zusammenfassung

Recommended Posts

Ruby: Nokogiri ermittelt automatisch den Zeichencode von HTML, das im Binärmodus gelesen wird
Korrigieren Sie den Zeichencode in Java und lesen Sie von der URL
Errate den Zeichencode in Java
Die Anwendung absorbiert den Unterschied im Zeichencode
[Löschen Sie den ersten Buchstaben der Zeichenfolge] Ruby
Implementieren Sie den Algorithmus in Ruby: Tag 3-Dichotomie-
[Ruby] Code zur Anzeige des Tages
[Ruby] Die Rolle von Indizes beim Lernen von Elementen in Arrays
Ruby, Nokogiri: Ruft den Elementnamen des ausgewählten Knotens ab
Rufen Sie die URL des HTTP-Umleitungsziels in Ruby ab
[Ruby on Rails] Geben Sie automatisch eine Adresse aus einer Postleitzahl ein
Geben Sie beim Erstellen mit Maven den Zeichencode der Quelle an