¿Cuáles son las diferencias entre los archivos .txt de Linux y Windows (codificación Unicode)

16

Solo estoy usando el juego de 128 caracteres definido en el estándar ANSI original.

Pero en general, ¿cómo están los archivos implicados de manera diferente?

No me preocupa la pantalla, es decir, si se muestra una pestaña con 6 u 8 caracteres pero la representación interna real en la memoria

Una diferencia que he escuchado es el uso de \ r \ n (Windows) vs. \ n para la terminación de línea (Linux).

Hennes
fuente
Creo que la marca de orden de bytes está matando mi #! (Primera línea) en mis archivos php que transferí de Windows a Linux. Todo el archivo funciona pero no puede encontrar el intérprete como debería. Si specefically aseguro de codificar en ANSI al seleccionar el método de codificación en el bloc de notas es cierto ASCII o lo hace de Windows hacer otra cosa
Vea si tiene bomstrip en su caja Gnu / Linux. Es parte de Debian (y al menos algunos otros), pero puede necesitar instalación. Es necesario porque Microsoft agrega erróneamente una BOM al inicio de los archivos utf-8.
ctrl-alt-delor

Respuestas:

17

"Unicode" en Windows es UTF-16LE, y cada carácter tiene 2 o 4 bytes. Linux usa UTF-8, y cada carácter tiene entre 1 y 4 bytes.

"El mínimo absoluto que todo desarrollador de software debe saber absolutamente, positivamente sobre los conjuntos de caracteres y Unicode (¡sin excusas!")

Ignacio Vazquez-Abrams
fuente
¿Windows desperdicia un byte?
1
Si no está usando nada fuera de Latin-1, sí.
Ignacio Vazquez-Abrams
Están en el artículo al que me vinculé.
Ignacio Vazquez-Abrams
1
Realicé una búsqueda de UTF-16LE pero no la encontré en el artículo.
1
Principalmente. También debe contar la lista de materiales si está presente.
Ignacio Vazquez-Abrams
11

Saltos de línea

Windows usa terminaciones de línea CRLF ( \r\n, 0D 0A) mientras que Unix solo usa LF ( \n, 0A).

Codificación de caracteres

Los sistemas Unix más modernos (es decir, desde 2004 más o menos) hacen que UTF-8 sea la codificación de caracteres predeterminada.

Windows, sin embargo, carece de soporte nativo para UTF-8. Funciona internamente en UTF-16 y supone que las charcadenas basadas en una página de códigos heredada . Afortunadamente, el Bloc de notas es capaz de leer archivos UTF-8; desafortunadamente, la codificación "ANSI" sigue siendo la predeterminada.

Personajes especiales problemáticos

SUSTITUTO U + 001A

Windows (rara vez) usa Ctrl+ Zcomo un carácter de fin de archivo. Por ejemplo, si tiene typeun archivo en el símbolo del sistema, se truncará en el primer 1Abyte.

En Unix, Ctrl+ Zno es nada especial.

U + FEFF CERO CON ESPACIO SIN FRENOS (Marca de orden de bytes)

En Windows, los archivos UTF-8 a menudo comienzan con una "marca de orden de bytes" EF BB BFpara distinguirlos de los archivos ANSI.

En Linux, se desaconseja la lista de materiales porque rompe cosas como líneas shebang en scripts de shell. Además, no tendría sentido tener una firma UTF-8 cuando UTF-8 es la codificación predeterminada de todos modos.

user46971
fuente
1
Ctrl-Z funciona en Windows al igual que Ctrl-D (o cualquier personaje con el que haya vinculado EOF stty) en Linux: el controlador de la consola lo traduce al final del archivo. El carácter literal no aparece en la secuencia de entrada; solo hace que read () regrese 0.
psusi
Creo que la marca de orden de bytes está matando mi #! (Primera línea) en mis archivos php que transferí de Windows a Linux. Todo el archivo funciona pero no puede encontrar el intérprete como debería. Si me aseguro de codificar en ANSI seleccionando el método de codificación en el bloc de notas, ¿es ASCII verdadero o Windows hace algo más?
1
Vale la pena mencionar que el pseudo término "página de códigos ANSI", aunque todavía aparece en programas como el Bloc de notas, es totalmente inapropiado, y Microsoft lo admitió hace mucho tiempo. Ver en.wikipedia.org/wiki/Windows_code_page para más detalles.
Incnis Mrsi
utf-8 no tiene una lista de materiales, pero MS-Windows inserta una. Haciéndolo no cierto utf-8. Una de las reglas de utf-8 es que cualquier archivo que pueda representarse en ascii es bit por bit idéntico en utf-8. También puede comenzar a leer utf-8 en cualquier punto de la transmisión.
ctrl-alt-delor
3

Una diferencia que he escuchado es el uso de \ r \ n (Windows) vs. \ n para saltos de línea (Linux).

Si. La mayoría de los editores de texto de UNIX manejarán esto automáticamente, los editores de programadores de Windows pueden manejar esto, los editores de texto generales (Bloc de notas base) no.

Windows también parece necesitar el EOF (Ctrl-Z) como FIN DE ARCHIVO en algunos contextos, mientras que probablemente nunca lo verá en UNIX.

Recuerde que MacOS X ahora es UNIX debajo, por lo que usa finales de línea UNIX. Aunque antes de OS X (MacOS 9 e inferior) tenía su propio final (\ r)

EDITAR: en otro formato CR y LF:

  • \ n es ASCII 0x0A, avance de línea (LF)
  • \ r es ASCII 0x0D, retorno de carro (CR)
Rich Homolka
fuente
¿Dónde están \ r \ n y \ n en el conjunto de caracteres ASCII? en.wikipedia.org/wiki/File:ASCII_Code_Chart.svg
2
@Chris \ n es ASCII 0x0A, avance de línea. \ r es ASCII 0x0D, retorno de carro
Rich Homolka
@ Rich ¿Qué pasa con EOF? ¿Es este un personaje ANSI?
2
@barlop, el terminal traduce la combinación de teclas (normalmente es ctrl-d en sistemas unix) en EOF, a menos que esta tecla de control haya sido desactivada. La aplicación lee un EOF en lugar de la tecla real que presionó. Es decir, read()devuelve cero bytes en lugar de cualquier carácter específico.
psusi
1
@barlop, eso es lo que he estado diciendo: no devuelve ningún carácter. read () devuelve el número de bytes que almacenó en su búfer. En EOF, simplemente le da cero bytes. Esa es la señal de que has llegado al final del archivo y que no hay nada más que leer.
psusi
1

La codificación Unicode utilizada no está basada en el sistema operativo.

Incluso Windows notepad.exe tiene opciones enumeradas: (pondré entre paréntesis lo que el bloc de notas quiere decir con eso) ANSI (no unicode), Unicode (el bloc de notas significa Unicode LE), Unicode Big Endian (BE), UTF-8

ANSI no es unicode, involucra un número muy limitado de caracteres, así que dejemos eso de lado.

Pero ver incluso el bloc de notas puede hacer LE, BE o UTF-8

Y aparte del bloc de notas, UTF-8 puede ser con o sin una lista de materiales.

Y uso Windows con Cygwin, aunque los puertos de Windows pueden funcionar \ r \ n incluso cuando especifique \ n. He visto sed hacer eso.

No hay una sola regla sobre qué codificación Unicode utiliza un SO en particular. No sería un sistema operativo muy flexible si lo hubiera.

Para ver realmente las diferencias, conozca el Software, qué codifica u ofrece un software.

Obtenga Cygwin y xxd, y / o un editor hexadecimal y observe lo que realmente hay dentro del archivo. Use el comando 'archivo' para ayudar a identificar un archivo. Entonces realmente ves lo que es UTF 16bit LE. Qué es UTF 16bit BE. Qué es UTF-8 (y UTF-8 puede ser con o sin una lista de materiales).

A veces puede decirle al bloc de notas que se guarde como unicode (por lo que el bloc de notas significa unicode little endian de 16 bits), y no lo hará. Pero elija una fuente Unicode como Arial Unicode, y copie algunos caracteres Unicode de Charmap y lo hará ... Y una buena manera de ver qué bloc de notas o cualquier software está haciendo, es mirando el hexadecimal de un archivo

C:\asdf>notepad.exe a.a

C:\asdf>file a.a
a.a; Little-endian UTF-16 Unicode text, with no line terminators

C:\asdf>type a.a
aaa慡ൡ <-- though displayed aaa followed by some boxes in my cmd window
C:\asdf>

C:\asdf>xxd a.a
0000000: fffe 6100 6100 6100 6161 610d            ..a.a.a.aaa.

C:\asdf>

^^ The portion of the byte that stores the 61 is the lower value portion which with LE is stored first.

El comando dd (un comando * nix que ejecuto desde cygwin dentro de windows) puede cambiarlo

C:\asdf>xxd -p a.a
fffe6100610061006161610d

C:\asdf>file a.a
a.a; Little-endian UTF-16 Unicode text, with no line terminators

C:\asdf>dd if=a.a conv=swab of=a.a2
0+1 records in
0+1 records out
12 bytes (12 B) copied, 0 seconds, Infinity B/s

C:\asdf>type a.a2
a  a a aaa
C:\asdf>xxd -p a.a2
feff00610061006161610d61

C:\asdf>file a.a2
a.a2; Big-endian UTF-16 Unicode text, with no line terminators

C:\asdf>

Y el bloc de notas en sí puede guardar como UTF-16 Big Endian o UTF-16 Little Endian o UTF-8

ingrese la descripción de la imagen aquí

Si eres una persona técnica o incluso un usuario de bloc de notas, ¡no estás obligado a una codificación debido a tu sistema operativo!

Supongo que UTF-8 tiene más sentido que UTF-16, UTF-16 usaría 16 bits incluso para caracteres que solo deberían necesitar 8 bits. Sin embargo, también tenga en cuenta que charmap muestra el código UTF-16.

Sublime (un editor de texto de Windows) guarda unicode como UTF-8 de forma predeterminada.

Yo uso Windows y, a veces, Unicode, y estoy usando UTF-8 principalmente.

Y como Windows es tan técnicamente flexible, ¡Linux es al menos tan técnicamente flexible!

barlop
fuente
¿Escribiste los comandos filey typedentro del indicador de Cygwin?
Vesnog
xxdy los typecomandos faltan en la instalación estándar de Cygwin, supongo. Aparte de eso, quiero reproducir sus resultados.
Vesnog
1
@Vesnog typees un comando estándar integrado en cmd.exe xxdque probablemente no esté instalado con cygwin de manera predeterminada, pero cuando instala cygwin o después, si inicia la configuración de cygwin obtendrá una larga lista de comandos que puede instalar para usar en cygwin, y simplemente escriba xxd en el cuadro de búsqueda de configuración de cygwin y aparecerá. xxd también está disponible después de la instalación de vim7 para que pueda obtenerlo desde allí también.
barlop
1
@Vesnog puede ejecutar comandos cygwin dentro de cygwin o fuera de cygwin. Si los ejecuta fuera de cygwin, agregue c:\cygwin\bin(si ese es el subdirectorio bin de cygwin), en su ruta. También se puede ejecutar / ejecutar cualquier comando interno de cmd como 'type' o 'dir', o cualquier exe externo como calc.exe (calculadora de Windows) desde cygwin. Casi todo lo que se puede ejecutar desde cygwin se puede ejecutar desde cmd y viceversa. Si desea usar bash, use cygwin y si tiene problemas con comillas simples o dobles, ejecute los comandos cygwin dentro de cygwin y cmd dentro de cmd.
barlop
1
@Vesnog xxd también puede escribir un archivo, por ejemplo echo 61|xxd -r -p>a.a, intentarlo. type a.a Así que en realidad puede obtener un volcado de bytes con xxd -p, reorganizar o modificar los bytes, luego alimentarlo en xxd -r -p y obtener un nuevo archivo diferente con una codificación diferente o diferentes datos basados ​​en los datos antiguos. El comando "archivo" está descubriendo la codificación, en función de los bytes.
barlop
-1

Linux usa UTF-8, y cada carácter tiene entre 1 y 6 bytes, no entre 1 y 4 bytes.

U00000000 - U0000007F: 0xxxxxxx
U00000080 - U000007FF: 110xxxxx 10xxxxxx
U00000800 - U0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U00010000 - U001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U00200000 - U03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U04000000 - U7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
es_una_literatura
fuente
Esto ya se indicó en una respuesta presentada en 2011.
Ramhound