Saltar al contenido

¿Convertir UTF-16 a UTF-8 y eliminar BOM?

Solución:

Esta es la diferencia entre UTF-16LE y UTF-16

  • UTF-16LE es little endian sin una lista de materiales
  • UTF-16 es grande o pequeño endian con una lista de materiales

Entonces, cuando usas UTF-16LE, la lista de materiales es solo una parte del texto. Usar UTF-16 en su lugar, la lista de materiales se elimina automáticamente. La razón UTF-16LE y UTF-16BE existe es para que las personas puedan llevar texto “correctamente codificado” sin listas de materiales, lo que no se aplica a usted.

Tenga en cuenta lo que sucede cuando codifica usando una codificación y decodifica usando la otra. (UTF-16 detecta automáticamente UTF-16LE a veces, no siempre.)

>>> u'Hello, world'.encode('UTF-16LE')
'Hx00ex00lx00lx00ox00,x00 x00wx00ox00rx00lx00dx00'
>>> u'Hello, world'.encode('UTF-16')
'xffxfeHx00ex00lx00lx00ox00,x00 x00wx00ox00rx00lx00dx00'
 ^^^^^^^^ (BOM)

>>> u'Hello, world'.encode('UTF-16LE').decode('UTF-16')
u'Hello, world'
>>> u'Hello, world'.encode('UTF-16').decode('UTF-16LE')
u'ufeffHello, world'
    ^^^^ (BOM)

O puede hacer esto en el caparazón:

for x in * ; do iconv -f UTF-16 -t UTF-8 <"$x" | dos2unix >"$x.tmp" && mv "$x.tmp" "$x"; done

Solo usa str.decode y str.encode:

with open(ff_name, 'rb') as source_file:
  with open(target_file_name, 'w+b') as dest_file:
    contents = source_file.read()
    dest_file.write(contents.decode('utf-16').encode('utf-8'))

str.decode se deshará de la lista de materiales por usted (y deducirá la endianidad).

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *