ruby on rails - Prawn:: Errors:: IncompatibleStringEncoding: su documento incluye texto que no es compatible con el conjunto de caracteres de Windows-1252




ruby-on-rails pdf (2)

Debajo está mi archivo PDF de Prawn para generar un nombre en el PDF -

def initialize(opportunity_application)
  pdf = Prawn::Document.new(:page_size => [1536, 2048], :page_layout => :landscape)
  cell_1 = pdf.make_cell(content: "Eylül Çamcı".force_encoding('iso-8859-1').encode('utf-8'), borders: [], size: 66, :text_color => "000000", padding: [0,0,0,700], font: "app/assets/fonts/opensans.ttf")

  t = pdf.make_table [[cell_1]]
  t.draw
  pdf.render_file "tmp/mos_certificates/application_test.pdf"
end

Cuando aparece el nombre Eylül Çamcı, que es turco, aparece el siguiente error:

Prawn::Errors::IncompatibleStringEncoding: Your document includes text that's not compatible with the Windows-1252 character set.
If you need full UTF-8 support, use TTF fonts instead of PDF's built-in fonts.

Ya estoy usando una fuente TTF que admite los caracteres en ese nombre, ¿qué puedo hacer para imprimir el nombre correctamente?


De este informe sobre Force Strings a UTF-8 desde cualquier codificación :

"Forzar" una codificación es fácil, sin embargo, no convertirá los caracteres simplemente cambiará la codificación:

str = str.force_encoding("UTF-8")
str.encoding.name # => 'UTF-8'

Si quieres realizar una conversión, usa la codificación

De hecho, como @MehmetKaplan dijo:

Se ve que Turquía falta en iso-8859-1.

Por otro lado, iso-8859-9 debería funcionar.

Por lo tanto, ya no necesitarás el force_encoding sino que solo encode

[37] pry(main)> "Eylül Çamcı".encode('iso-8859-1')
Encoding::UndefinedConversionError: U+0131 from UTF-8 to ISO-8859-1
from (pry):39:in `encode'
[38] pry(main)> "Eylül Çamcı".encode('iso-8859-9')
=> "Eyl\xFCl \xC7amc\xFD"

Esto significa que debe descartar el UTF-8 completamente en su código.

content: "Eylül Çamcı".encode('iso-8859-9'),

No estoy seguro de recordar cómo funciona Prawn, pero los archivos PDF no son compatibles con UTF-8, que es la codificación predeterminada de Ruby para objetos String.

De hecho, los archivos PDF solo admiten la codificación ASCII utilizando fuentes internas; cualquier otra codificación requiere que traiga su propia fuente (que también se recomienda para la portabilidad).

La solución consiste en usar mapas de caracteres (CMaps), ya sea CMaps personalizados o predefinidos (fuente BYO).

En general, los archivos PDF incluyen una fuente incrustada (o un subconjunto de una fuente) y un CMap, mapeando el valor de un byte (o, un número de bytes) a un glifo de fuente deseado. es decir, mapeo de 97, que es 'a' en ASCII, para el glifo å cuando se utiliza la fuente especificada.

La última vez que usé Gambas, creo que admitía fuentes TTF y creaba mapas de fuentes automáticamente usando cadenas UTF-8 para el ingreso de texto, pero tienes que cargar una fuente apropiada en Gamba y ¡recuerda usarla !

Puedes ver un ejemplo en esta respuesta .

¡Buena suerte!

EDITAR

Actualicé la respuesta para reflejar los comentarios de @ mkl.

@mkl señaló que otras codificaciones son compatibles o posibles (fuente BYO), incluida una codificación predefinida de varios bytes (que utiliza CMaps predefinidos).





prawn