Apa perbedaan antara file Linux dan Windows .txt (Unicode encoding)

16

Saya hanya menggunakan set karakter 128 yang didefinisikan dalam standar ANSI asli.

Tetapi secara keseluruhan, bagaimana file-file tersebut diimplementasikan secara berbeda.

Saya tidak peduli dengan tampilan, yaitu jika tab ditampilkan dengan 6 atau 8 karakter tetapi representasi internal yang sebenarnya dalam memori

Satu perbedaan yang saya dengar adalah penggunaan \ r \ n (Windows) vs. \ n untuk penghentian baris (Linux).

Hennes
sumber
Saya pikir tanda urutan byte membunuh # saya! (Baris pertama) dalam file php saya, saya ditransfer dari windows ke linux. Seluruh file berfungsi tetapi tidak dapat menemukan juru bahasa sebagaimana mestinya. Jika saya secara spesifik memastikan untuk meng-encode di ANSI dengan memilih metode pengkodean di notepad apakah itu benar ASCII atau apakah Windows melakukan sesuatu yang lain
Lihat apakah Anda memiliki bomstrip di kotak Gnu / Linux Anda. Ini adalah bagian dari Debian (dan setidaknya beberapa lainnya), tetapi mungkin perlu menginstal. Ini diperlukan karena Microsoft secara keliru menambahkan BOM ke awal file utf-8.
ctrl-alt-delor

Jawaban:

17

"Unicode" pada Windows adalah UTF-16LE, dan setiap karakter berukuran 2 atau 4 byte. Linux menggunakan UTF-8, dan setiap karakter adalah antara 1 dan 4 byte.

"Minimum absolut setiap pengembang perangkat lunak mutlak, pasti harus tahu tentang Unicode dan set karakter (tanpa alasan!)"

Ignacio Vazquez-Abrams
sumber
Windows menghabiskan satu byte?
1
Jika Anda tidak menggunakan apa pun di luar Latin-1, ya.
Ignacio Vazquez-Abrams
Mereka ada di artikel yang saya tautkan.
Ignacio Vazquez-Abrams
1
Jalankan pencarian untuk UTF-16LE tetapi tidak menemukannya dalam artikel.
1
Kebanyakan. Anda juga perlu menghitung BOM jika ada.
Ignacio Vazquez-Abrams
11

Jeda baris

Windows menggunakan ujung garis CRLF ( \r\n, 0D 0A) sementara Unix hanya menggunakan LF ( \n, 0A).

Pengkodean Karakter

Paling modern (yaitu, sejak 2004 atau lebih) Sistem seperti Unix menjadikan UTF-8 sebagai pengkodean karakter default.

Windows, bagaimanapun, tidak memiliki dukungan asli untuk UTF-8. Ini secara internal bekerja di UTF-16, dan mengasumsikan bahwa charstring berbasis-berada di halaman kode warisan . Untungnya, Notepad mampu membaca file UTF-8; sayangnya, pengkodean "ANSI" masih merupakan default.

Karakter Khusus Bermasalah

U + 001A PENGGANTI

Windows (jarang) menggunakan Ctrl+ Zsebagai karakter akhir file. Misalnya, jika Anda typefile pada prompt perintah, itu akan dipotong pada 1Abyte pertama .

Di Unix, Ctrl+ Ztidak ada yang istimewa.

U + FEFF NOL TANPA RUANG BREAK (Tanda Byte-Order)

Pada Windows, file UTF-8 sering mulai dengan "tanda urutan byte" EF BB BFuntuk membedakannya dari file ANSI.

Di Linux, BOM tidak disarankan karena merusak hal-hal seperti baris shebang di skrip shell. Plus, tidak ada gunanya memiliki tanda tangan UTF-8 ketika UTF-8 adalah penyandian default.

pengguna46971
sumber
1
Ctrl-Z bekerja di windows seperti halnya Ctrl-D (atau karakter apa pun yang terikat dengan EOF stty) pada Linux: driver konsol menerjemahkannya ke akhir file. Karakter literal tidak muncul dalam aliran input; itu hanya menyebabkan read () mengembalikan 0.
psusi
Saya pikir tanda urutan byte membunuh # saya! (Baris pertama) dalam file php saya, saya ditransfer dari windows ke linux. Seluruh file berfungsi tetapi tidak dapat menemukan juru bahasa sebagaimana mestinya. Jika saya secara spesifik memastikan untuk mengkodekan dalam ANSI dengan memilih metode pengkodean dalam notepad apakah itu benar ASCII atau apakah Windows melakukan sesuatu yang lain?
1
Perlu disebutkan bahwa "halaman kode ANSI" pseudo-istilah, meskipun masih muncul dalam program-program seperti Notepad, benar-benar keliru, dan Microsoft mengakui ini sejak lama. Lihat en.wikipedia.org/wiki/Windows_code_page untuk detailnya.
Incnis Mrsi
utf-8 tidak memiliki BOM, tetapi MS-Windows memasukkan satu. Membuatnya tidak benar utf-8. Salah satu aturan utf-8 adalah bahwa file apa pun yang dapat direpresentasikan dalam ascii, bit for bit identik dalam utf-8. Anda juga dapat mulai membaca utf-8 kapan saja di aliran.
ctrl-alt-delor
3

Satu perbedaan yang saya dengar adalah penggunaan \ r \ n (Windows) vs. \ n untuk jeda baris (Linux).

Iya. Kebanyakan editor teks UNIX akan menangani ini secara otomatis, editor programer Windows mungkin menangani ini, editor teks umum (Notepad dasar) tidak akan melakukannya.

Windows tampaknya juga membutuhkan EOF (Ctrl-Z) sebagai END OF FILE dalam beberapa konteks, sedangkan Anda mungkin tidak akan pernah melihatnya di UNIX.

Ingat bahwa MacOS X sekarang UNIX di bawahnya, jadi ia menggunakan akhiran baris UNIX. Meskipun sebelum OS X (MacOS 9 dan di bawah) ia memiliki akhir sendiri (\ r)

EDIT: dalam format CR dan LF lainnya:

  • \ n adalah ASCII 0x0A, Line Feed (LF)
  • adalah ASCII 0x0D, Carriage return (CR)
Homolka yang kaya
sumber
Di mana \ r \ n dan \ n dalam set karakter ASCII? en.wikipedia.org/wiki/File:ASCII_Code_Chart.svg
2
@Chris \ n adalah ASCII 0x0A, Line Feed. adalah ASCII 0x0D, Carriage return
Rich Homolka
@ Kaya Bagaimana dengan EOF? Apakah ini karakter ANSI?
2
@barlop, terminal menerjemahkan keystroke (biasanya ctrl-d pada sistem unix) menjadi EOF, kecuali kunci kontrol ini telah dinonaktifkan. Aplikasi membaca EOF daripada kunci aktual yang Anda tekan. Dengan kata lain, read()mengembalikan nol byte alih-alih karakter tertentu.
psusi
1
@barlop, itulah yang saya katakan: tidak mengembalikan karakter apa pun . read () mengembalikan jumlah byte yang disimpan di buffer Anda. Pada EOF, itu hanya memberi Anda nol byte. Itu adalah sinyal bahwa Anda telah mencapai akhir file, dan tidak ada lagi yang bisa dibaca.
psusi
1

Encoding Unicode apa yang digunakan bukan berbasis OS.

Bahkan Windows notepad.exe memiliki opsi terdaftar- (saya akan memasukkan tanda kurung apa maksudnya notepad itu) ANSI (bukan unicode), Unicode (notepad berarti Unicode LE), Unicode Big Endian (BE), UTF-8

ANSI bukan unicode, ini melibatkan jumlah karakter yang sangat terbatas, jadi mari kita kesampingkan itu.

Tetapi melihat bahkan notepad dapat melakukan LE, atau BE, atau UTF-8

Dan selain notepad, UTF-8 dapat dengan atau tanpa BOM.

Dan saya menggunakan Windows dengan Cygwin meskipun port Windows mungkin melakukan \ r \ n bahkan ketika Anda menentukan \ n Telah melihat dan melakukannya.

Tidak ada satu aturan pun tentang apa pengkodean Unicode menggunakan OS tertentu. Itu tidak akan menjadi OS yang sangat fleksibel jika ada.

Untuk benar-benar melihat perbedaan, ketahui Perangkat Lunak, apa yang Encoding gunakan atau tawarkan oleh perangkat lunak.

Dapatkan Cygwin dan xxd, dan / atau hex editor dan lihat apa yang sebenarnya ada di dalam file. Gunakan perintah 'file' untuk membantu mengidentifikasi file. Maka Anda benar-benar melihat apa UTF 16bit LE itu. Apa itu UTF 16bit BE. Apa itu UTF-8 (dan UTF-8 dapat dengan atau tanpa BOM).

Kadang-kadang Anda dapat memberitahu notepad untuk menyimpan sebagai unicode (dengan mana notepad berarti unicode 16 bit endian kecil), dan itu tidak akan. Tetapi pilih font unicode seperti arial unicode, dan salin dalam beberapa karakter unicode dari charmap dan itu akan .. Dan cara yang baik untuk melihat apa yang dilakukan notepad atau perangkat lunak apa pun, adalah dengan melihat hex file.

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.

Perintah dd (perintah * nix yang saya jalankan dari cygwin di dalam windows) dapat mengubahnya

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>

Dan notepad itu sendiri dapat disimpan sebagai UTF-16 Big Endian atau UTF-16 Little Endian atau UTF-8

masukkan deskripsi gambar di sini

Jika Anda orang teknis atau bahkan hanya pengguna notepad, Anda tidak terikat pada satu penyandian karena OS Anda!

Saya kira UTF-8 lebih masuk akal daripada UTF-16, UTF-16 akan menggunakan 16 bit bahkan untuk karakter yang hanya membutuhkan 8 bit. Namun, ingatlah bahwa charmap menunjukkan kode UTF-16.

Sublime (editor teks windows) menyimpan unicode sebagai UTF-8 secara default.

Saya menggunakan Windows dan terkadang unicode, dan saya kebanyakan menggunakan UTF-8.

Dan karena Windows fleksibel secara teknis, linux setidaknya fleksibel secara teknis!

barlop
sumber
Apakah Anda menulis perintah filedan typedi dalam Cygwin prompt?
Vesnog
xxddan typeperintah hilang dalam instalasi Cygwin standar saya kira. Selain itu saya ingin mereproduksi hasil Anda.
Vesnog
1
@Vesnog typeadalah perintah standar yang dibangun ke dalam cmd.exe xxdkemungkinan besar tidak diinstal dengan cygwin secara default, tetapi ketika Anda menginstal cygwin atau setelahnya, jika Anda memulai pengaturan cygwin Anda mendapatkan daftar panjang perintah yang dapat Anda instal untuk digunakan di cygwin, dan cukup ketik xxd ke dalam kotak pencarian pengaturan cygwin dan muncul. xxd juga tersedia dari setelah instalasi vim7 sehingga Anda bisa mendapatkannya dari sana juga.
barlop
1
@Vesnog Anda dapat menjalankan perintah cygwin di dalam cygwin atau di luar cygwin. Jika Anda menjalankannya di luar cygwin kemudian tambahkan c:\cygwin\bin(jika itu adalah subdirektori bin cygwin), ke jalur Anda. Juga setiap perintah cmd internal seperti 'ketik' atau 'dir', atau exe eksternal seperti calc.exe (kalkulator windows) dapat dijalankan / diluncurkan dari dalam cygwin. Cukup banyak hal yang dapat dijalankan dari cygwin dapat dijalankan dari cmd dan sebaliknya. Jika Anda ingin menggunakan bash maka gunakan cygwin dan jika Anda mengalami masalah dengan tanda kutip tunggal vs ganda kemudian jalankan perintah cygwin di dalam cygwin dan yang cmd dalam cmd.
barlop
1
@Vesnog xxd dapat menulis file juga, misalnya echo 61|xxd -r -p>a.alalu coba type a.a Jadi Anda benar-benar bisa mendapatkan dump byte dengan xxd -p, mengatur ulang atau memodifikasi byte kemudian memasukkannya ke xxd -r -p dan mendapatkan file berbeda baru dengan pengkodean yang berbeda atau data berbeda berdasarkan data lama. Perintah "file" mencari tahu pengodean, berdasarkan byte.
barlop
-1

Linux menggunakan UTF-8, dan setiap karakter adalah antara 1 dan 6 byte, bukan antara 1 dan 4 byte.

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
it_is_a_literature
sumber
Ini sudah dinyatakan dalam jawaban yang diajukan pada tahun 2011.
Ramhound