6

私はこのコードを持っています:

# encoding: utf-8
require 'nokogiri'

s = "<a href='/path/to/file'>Café Verona</a>".encode('UTF-8')
puts "Original string: #{s}"

@doc = Nokogiri::HTML::DocumentFragment.parse(s)

links = @doc.css('a')
only_text = 'Café Verona'.encode('UTF-8')
puts "Replacement text: #{only_text}"
links.first.replace(only_text)
puts @doc.to_html

ただし、出力は次のとおりです。

Original string: <a href='/path/to/file'>Café Verona</a>
Replacement text: Café Verona
Café Verona

@docテキストのエンコーディングが間違っているのはなぜですか?

を使ったり使わなかっencode('UTF-8')たりしてみましDocumentDocumentFragmentが、同じ問題です。

Ruby 1.9.3p194 で Nokogiri v1.5.6 を使用しています。

4

2 に答える 2

5

nokogiri テキストオブジェクトを渡すと、それが機能するようです ;)

links.first.replace Nokogiri::XML::Text.new(only_text, @doc)
于 2013-03-01T01:49:24.753 に答える
0

問題を再現することはできませんが、次の 2 つの方法を試す必要があります。

使用する代わりに:

s = "<a href='/path/to/file'>Café Verona</a>".encode('UTF-8')

試す:

s = "<a href='/path/to/file'>Café Verona</a>"

ステートメントのため、文字列はすでに UTF-8 でエンコードされています# encoding: utf-8。そのため、これをスクリプトに入れて、Ruby にリテラル文字列が UTF-8 であることを伝えます。二重にエンコードしている可能性はありますが、Ruby がそうするとは思いません。すでに UTF-8 であるため、2 回目の試行は黙って無視する必要があります。

私が疑問に思っているもう1つのことは、次のような出力です。

Café Verona

システムと端末の言語/文字セットのエンコーディングが正しくないことを示しています。他の何かに設定されたシステムで UTF-8 文字列を出力しようとすると、端末やブラウザーで不一致が発生する可能性があります。Windows システムは通常、UTF-8 ではなく、Win-1252、ISO-8859-1 または類似のものです。私の Mac OS システムでは、次の環境変数が設定されています。

LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8

iso-8859-1 でエンコードされた html を開いて、ノコギリがアクセントを台無しにする」も役立つかもしれません。

于 2013-03-01T02:26:50.357 に答える