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)