Copiar/Pegar de documentos (PDF, docx): comportamiento extraño de los signos diacríticos

Cuando copio texto de PDF (Vista previa) o Docx (Páginas) con caracteres checos, algunos de los caracteres checos se copian con el acento "pegado" a ellos.

Para hacer esto aún más extraño, este comportamiento es bastante inconsistente: a veces "ř" se copia bien, a veces no. Además, no parece estar conectado a una fuente específica. Pero creo que esto sucede más a menudo con fuentes que no son nativas para OSX (como Cambria, que es la predeterminada de MS Office).

Captura de pantalla del área de texto WYSYWIG de WordPress

Resultado de CMD+C para "í": "í́"

¿Por qué está pasando esto?

Editar

  • OSX: 10.13.6 (aunque me pasó en SO más antiguos e incluso en otras máquinas)
  • aplicaciones, he copiado el texto de: Vista previa (PDF), Páginas (doc, docx)
  • aplicaciones, donde he pegado el texto en: cualquier cosa (desde texto Sublime hasta editor de texto en StackExchange, ver arriba)

Además, he notado que esto sucede a menudo al final de las palabras (posiblemente al final de las líneas). Lo confirmaré una vez que vuelva a suceder, ya que el comportamiento es frustrantemente difícil de reproducir.

¿Podría aclarar cuál es su proceso? ¿Abrir un archivo .docx con Pages, luego exportarlo a pdf y luego copiar/pegar? ¿Dónde?
Abra un archivo .docx con Pages (por ejemplo, como también sucede con otras herramientas), copie el texto, péguelo prácticamente en cualquier lugar (ya sea texto Sublime, editor WordPress TinyMCE o cualquier otra cosa).
Este comportamiento a veces ocurre en doc/docx (como se describe arriba), a veces en pdf (abierto en Vista previa, por ejemplo). Lamentablemente, no tengo MS Word instalado, así que no puedo probar a pegar el texto allí.
@TomGewecke, edité mi pregunta con esos detalles. ¡Gracias!
¿Usar Adobe Reader en lugar de Preview hace alguna diferencia? Ese es el estándar de oro para pdf.

Respuestas (2)

Lo que está tratando es uno de los muchos síntomas de lo que considero la ruina de la existencia de todos los programadores modernos: la normalización Unicode y el intercambio de codificaciones de caracteres.

Literalmente se podría escribir un libro de 1000 páginas solo sobre la historia de este caos (y no me sorprendería que alguien ya lo haya hecho), así que lo reduciré a lo básico de lo que está encontrando aquí (y yo Estaré simplificando un poco), pero luego te daré algunos enlaces para "lecturas adicionales".

Primero, asegurémonos de que tienes tu Menú de entrada en tu barra de menú: En Preferencias del sistema, abre el Panel de preferencias del teclado y marca la casilla debajo de "Fuentes de entrada". Luego, desde ese elemento del menú, abra lo que ahora se llama "Mostrar emoji y símbolos". en la parte superior izquierda de la ventana, seleccione "Personalizar lista", vaya a "Tablas de códigos" y marque "Unicode" e "ISO-8859-1". Haremos una breve conferencia y luego una demostración.

De nuevo, aquí hay dos cuestiones interrelacionadas pero separadas:

1. Codificaciones de caracteres

Considero que esta es la causa raíz de este problema en particular. El problema es que Microsoft se ha destacado durante años por no manejar bien Unicode porque sus plataformas se han apegado más o menos al uso de una implementación anterior de conjuntos de caracteres multilingües, conocidos como "caracteres anchos", UCS-2 o UTF-16. Este sistema se implementó hace años, en un momento en que se pensaba que 16 bits (para representar ~65 000 caracteres) serían suficientes para codificar todos los símbolos que necesitaríamos. Hoy en día, hay 1.114.112 símbolos Unicode estandarizados.

Así que hoy en día, la mayoría de los sistemas (y todo lo relacionado con Apple) usan una codificación llamada UTF-8, una codificación de caracteres de ancho variable , en la que no hay una cantidad determinada de bits para codificar un carácter determinado. Esto le permite ser compatible con ASCII, y también puede agregar nuevos símbolos y caracteres como desee.

Por lo tanto, al copiar texto dentro y fuera de programas que usan un conjunto de caracteres diferente (como el de Microsoft), el conjunto de caracteres debe volver a codificarse y convertirse por completo, un proceso conocido tradicionalmente como , aunque hay literalmente docenas de implementaciones de cómo iconvesto está hecho.

2. Combinación de caracteres Unicode

Para complicar el problema de las codificaciones está el hecho de que el estándar Unicode ha evolucionado a lo largo de los años y se dio cuenta de que para mantener la cantidad de caracteres únicos limitada a "solo" millones, en lugar de miles de millones, sería mejor tener algunos los caracteres sean "caracteres combinables", caracteres que modifican al anterior de forma regular. Al hacerlo, no necesita una entrada separada para cada letra con cada variante de acento, simplemente agrega un carácter de acento "compartido" al carácter original. Pero no siempre se hizo así, por lo que hay múltiples formas de producir el mismo símbolo. El tuyo es el ejemplo perfecto.


Empezamos con el símbolo LETRA I MINÚSCULA LATINA (U+0069):

i

Ahora, cuando desee agregar el acento agudo, Microsoft lo reemplaza con

LETRA I MINÚSCULA LATINA CON AGUDO (U+00ED):

í

Pero Apple, en cambio, agrega un segundo carácter, COMBINANDO ACENTO AGUDO (U+0301):

́

Puede hacerlo usted mismo (aquí es donde entra en juego el visor de caracteres). Simplemente escriba un i, luego busque combining acuteen el Visor de caracteres, haga doble clic en el símbolo y listo:

Que es, de hecho, completamente diferente al primer símbolo, arriba. Es LETRA I MINÚSCULA LATINA (U+0069) seguida de ACENTO AGUDO COMBINADO (U+0301). Copie y pegue cada uno en el Visor de caracteres, y verá lo que quiero decir.

Sí, ambos representan visualmente el mismo símbolo. Pero si de alguna manera a lo largo de la línea (generalmente al mismo tiempo que la conversión del conjunto de caracteres), un proceso UTF-8 agrega el carácter combinado, pero se conserva el carácter precombinado original. Es decir, ¿qué sucede cuando el enfoque de "símbolos combinados" se agrega de alguna manera a la versión heredada, en lugar de reemplazarla ? Bueno, el acento de "combinación de caracteres" seguirá queriendo hacer su trabajo.

Entonces, cuando uno combina la LETRA I MINÚSCULA LATINA CON AGUDO (U+00ED) con ACENTO AGUDO COMBINADO (U+0301):

í́

Y ahí lo tienes.

Hay una respuesta de desbordamiento de pila muy famosa que demuestra hasta dónde puede llegar esto.


Algunas lecturas ligeras:

Geoff, me encanta tu explicación de cómo llegamos a í́la situación. :) Gracias y disculpa por no poder otorgarte la recompensa (ya que definitivamente te la mereces), no alcancé el límite de tiempo...

Con respecto a copiar/pegar desde pdf, el proceso de creación de pdf en particular puede estropear el tratamiento de los caracteres que no son ascii. Sin información sobre cómo se generaron sus archivos PDF, como la codificación y las fuentes utilizadas, es difícil determinar por qué los resultados no son correctos.

Sí, sé que es realmente difícil identificar el problema cuando ocurre de manera tan aleatoria. Esperaba que alguien tuviera una experiencia similar que pudiera arrojar un poco de luz sobre lo que está pasando allí.