2012-01-08 11 views
1

Nokogiriで解析されたHTMLドキュメントを取得しています。 HTMLは文字セットISO-8859-1を使用しています。問題は、Unicodeの文字がドキュメント内にあり、それぞれの文字の代わりにUnicodeのコードポイントに変換されることです。RubyでUnicodeコードポイントをエンコードする

例えば、これは、(ISO-8859-1に)受信したHTMLでいくつかのテキストです:

\x95\x95 JOHNNY VENETTI \x95\x95 

そして、このテキストを操作しようとすると、それはこれに変換される:

\u0095\u0095 JOHNNY VENETTI \u0095\u0095 

私の質問は、これらの文字がコードポイントではなく適切な文字として表示されるようにする方法です。私はテキスト上でgsubをやってみましたが、これは間違っているようです。また、私はHTML文書のエンコーディングを制御できません。

+2

「0x95」または149は、ISO-8859-1の有効な文字コードではありません。 [CP-1252](http://en.wikipedia.org/wiki/Windows-1252)を意味しましたか( '0x95'はシンボル'? ')ですか? –

答えて

3

まず、この文字列がませ ISO-8859-1でエンコード(file"Non-ISO extended-ASCII text"the codepageがこれを確認すると言う)であることを認識すべきです。おそらくこれがあなたの問題であるかもしれません。その場合、HTML文書に正しいエンコーディング(この場合はWindows-1252のようなもの)を指定する必要があります。

Nokogiri.HTML("<p>\x95\x95 JOHNNY VENETTI \x95\x95</p>", nil, "Windows-1252") 
# => #<Nokogiri::HTML::Document: ... 
#  children=[#<Nokogiri::XML::Text:0x15744cc "•• JOHNNY VENETTI ••">]>]>]>]> 

あなたはきれいに上記のようにこれを解決するためのオプションを持っていない場合は、あなたも行うことができます:、あなたはまた、ドキュメントが間違ったエンコーディングを指定する場合には、明示的にエンコーディングを設定することができます鋸山で

それは困難な方法であり、正しい文字列で文字列を関連付けました。

s = "\x95\x95 JOHNNY VENETTI \x95\x95" 
s.encoding # => #<Encoding:ASCII-8BIT> 
s.force_encoding 'Windows-1252' 
s.encode! 'utf-8' 
s # => "•• JOHNNY VENETTI ••" 

この最後のコードはRuby 1.9のみです。あなたが望むなら、more about the new encoding system in Ruby 1.9を読むことができます。

+0

うん、そうだった。正しい初期エンコーディングを知ることで、すべての違いが生じました。私が使用していたすべてのツールによれば、HTMLはISO-8859-1にありました。実際、Windows-1252でした。ありがとう! –

+1

@マイケル:嬉しいことに私は助けることができた。あなたが興味を持っている場合に備えて、私はいくつかの情報を追加しました。楽しむ。 –

関連する問題