2014-12-09 2 views
0

У меня есть проблемы Runnig этот код с Prawn:креветка кодирование не исправить

require 'prawn' 
Prawn::Document.generate "example.pdf" do |pdf| 
    pdf.text_box "W\xF6rth".force_encoding('UTF-8'), :at => [200,720], :size => 32 
end 

каким-то образом я получаю эту ошибку:

`rescue in normalize_encoding': Arguments to text methods must be UTF-8 
    encoded(Prawn::Errors::IncompatibleStringEncoding) 

Но когда я пытаюсь этот код, он работает:

pdf.text_box "Wörth".force_encoding('UTF-8') 

Что я не так? Как я могу также исправить свой первый пример с помощью \xF6 в строке? Благодаря!

ответ

1

"W\xF6rth" не является допустимой последовательностью UTF-8.

"W\xF6rth".valid_encoding? 
=> false 

Максимальный один байт код символа в UTF-8, 0x7F, после того, что вам нужно, чтобы начать кодирование с двумя байтами.

"Wörth".bytes.map { |b| b.to_s(16) } 
=> ["57", "c3", "b6", "72", "74", "68"] 
      ^^----^^ <-- Two bytes representing UTF-8 "ö" 

Я думаю, вы пытаетесь преобразовать ISO-8859-1 в UTF-8.
В ISO-8859-1 «ö» - 0xF6.

Это то, что должно работать в вашем случае:

"W\xf6rth".force_encoding('iso-8859-1').encode('utf-8') 
=> "Wörth" 

Т.е.

pdf.text_box "W\xF6rth".force_encoding('iso-8859-1').encode('utf-8'), ... 

Ссылки:

http://en.wikipedia.org/wiki/ISO/IEC_8859-1
http://en.wikipedia.org/wiki/UTF-8

Смежные вопросы