Linux ve Windows .txt dosyaları arasındaki farklar nelerdir (Unicode kodlaması)


16

Yalnızca orijinal ANSI standardında tanımlanan 128 karakter kümesini kullanıyorum.

Ancak bir bütün olarak dosyalar nasıl farklı şekilde uygulanır.

Ekranla ilgilenmiyorum, yani 6 veya 8 karakterli bir sekme görüntüleniyorsa, ancak bellekteki gerçek dahili gösterim

Duyduğum bir fark, hat sonlandırması için \ r \ n (Windows) ve \ n kullanılmasıdır (Linux).


Ben bayt sırası işareti pencerelerden linux aktarılan benim php dosyaları benim #! (İlk satır) öldürüyor düşünüyorum. Tüm dosya çalışıyor ancak yorumlayıcıyı olması gerektiği gibi bulamıyor.

Gnu / Linux kutunuzda bomstrip olup olmadığını görün. Debian'ın (ve en azından bazılarının) bir parçasıdır, ancak yüklenmesi gerekebilir. Microsoft, utf-8 dosyalarının başına yanlışlıkla bir Malzeme Listesi eklediğinden gereklidir.
ctrl-alt-delor

Yanıtlar:


17

Windows'taki "Unicode" UTF-16LE'dir ve her karakter 2 veya 4 bayttır. Linux UTF-8 kullanır ve her karakter 1 ile 4 bayt arasındadır.

"Mutlak Minimum Her Yazılım Geliştiricisi Kesinlikle, Olumlu Bir Şekilde Unicode ve Karakter Kümelerini Bilmeli (Bahane Yok!)"


Windows bayt boşa mı gidiyor?

1
Latin-1 dışında bir şey kullanmıyorsanız, evet.
Ignacio Vazquez-Abrams

Bağlantı verdiğim makalede.
Ignacio Vazquez-Abrams

1
UTF-16LE için bir arama gerçekleştirdi, ancak makalede bulamadı.

1
Çoğunlukla. Varsa ürün ağacını da saymanız gerekir .
Ignacio Vazquez-Abrams

11

Satır kesmeleri

Windows CRLF ( \r\n, 0D 0A) satır sonlarını kullanırken Unix sadece LF ( \n, 0A) kullanır .

Karakter kodlaması

Çoğu modern (yani 2004'ten beri) Unix benzeri sistemler UTF-8'i varsayılan karakter kodlaması yapar.

Ancak Windows, UTF-8 için yerel desteğe sahip değildir. Dahili olarak UTF-16'da çalışır ve chartabanlı dizelerin eski bir kod sayfasında olduğunu varsayar . Neyse ki, Not Defteri UTF-8 dosyalarını okuyabilir; ne yazık ki, "ANSI" kodlaması hala varsayılan değerdir.

Sorunlu Özel Karakterler

U + 001A YEDEK PARÇA

Windows (nadiren) Ctrl+ Z, dosya sonu karakteri olarak kullanılır. Örneğin type, komut isteminde bir dosyaysanız, ilk 1Abaytta kesilir .

Unix'te Ctrl+ Zözel bir şey değildir.

KIRILMAYAN ALANLI U + FEFF SIFIR (Bayt Sırası İşareti)

Windows'da UTF-8 dosyaları EF BB BFANSI dosyalarından ayırt etmek için genellikle bir "bayt sırası işareti" ile başlar.

Linux'ta, BOM cesaretini kırıyor çünkü kabuk senaryolarında yer alan satır satırları gibi şeyleri bozuyor. Ayrıca, UTF-8 zaten varsayılan kodlama olduğunda UTF-8 imzası olması anlamsız olurdu.


1
Ctrl-Z, tıpkı Linux'ta Ctrl-D (veya EOF'a bağlı olduğunuz herhangi bir karakter) gibi pencerelerde çalışır stty: Konsol sürücüsü dosyayı sonuna çevirir. Değişmez karakter giriş akışında görünmez; sadece read () işlevinin 0'a dönmesine neden olur.
psusi

Ben bayt sırası işareti pencerelerden linux aktarılan benim php dosyaları benim #! (İlk satır) öldürüyor düşünüyorum. Tüm dosya çalışıyor ancak yorumlayıcıyı olması gerektiği gibi bulamıyor. Spicefically not defterinde kodlama yöntemini seçerek ANSI kodlamak emin olun gerçek ASCII veya Windows başka bir şey yapıyor mu?

1
Sözde “ANSI kod sayfası” teriminin Not Defteri gibi programlarda hala görünmesine rağmen, tamamen yanlış bir isim olduğunu ve Microsoft'un bunu uzun zaman önce kabul ettiğini belirtmek gerekir. Ayrıntılar için en.wikipedia.org/wiki/Windows_code_page sayfasına bakın.
Incnis Mrsi

utf-8'de bir Malzeme Listesi yoktur, ancak MS-Windows bir tane ekler. Doğru değil utf-8. Utf-8'in kurallarından biri, ascii'de temsil edilebilecek herhangi bir dosyanın utf-8'de biraz aynı olduğu yönündedir. Ayrıca akıştaki herhangi bir noktada utf-8 okumaya başlayabilirsiniz.
ctrl-alt-delor

3

Duyduğum bir fark, satır sonları (Linux) için \ r \ n (Windows) ve \ n kullanılmasıdır.

Evet. Çoğu UNIX metin düzenleyicisi bunu otomatik olarak halleder, Windows programcıları düzenleyicileri bunu halledebilir, genel metin düzenleyicileri (temel Not Defteri) işlemez.

Windows'un bazı bağlamlarda EOF'a (Ctrl-Z) DOSYA SONU olarak ihtiyacı var gibi görünüyor , ancak muhtemelen UNIX'te hiç görmeyeceksiniz.

MacOS X'in artık altında UNIX olduğunu ve bu nedenle UNIX satır sonlarını kullandığını unutmayın. Gerçi OS X (MacOS 9 ve altı) önce kendi sonu vardı (\ r)

EDIT: başka bir biçimde CR ve LF:

  • \ n ASCII 0x0A, Satır Besleme (LF)
  • ASCII 0x0D, Satır başı (CR)

ASCII karakter kümesinde \ r \ n ve \ n nerede? en.wikipedia.org/wiki/File:ASCII_Code_Chart.svg

2
@Chris \ n, ASCII 0x0A, Satır Besleme'dir. ASCII 0x0D, Satır başı
Rich Homolka

@Rich EOF ne olacak? Bu bir ANSI karakteri mi?

2
@barlop, terminal, bu kontrol anahtarı devre dışı bırakılmadığı sürece tuş vuruşunu (normalde unix sistemlerde ctrl-d) EOF'ye çevirir. Uygulama vurduğunuz gerçek anahtar yerine bir EOF okur. Yani read()herhangi bir karakter yerine sıfır bayt döndürür.
psusi

1
@barlop, bunu söylüyorum: herhangi bir karakter döndürmüyor . read (), arabelleğinizde sakladığı bayt sayısını döndürür. EOF'da, size sıfır bayt verir. Bu, dosyanın sonuna ulaştığınız ve okunacak başka bir şeyin olmadığı sinyalidir.
psusi

1

Unicode kodlamasının kullanıldığı işletim sistemi tabanlı değildir.

Windows notepad.exe bile listelenen seçeneklere sahiptir.

ANSI unicode değil çok sınırlı sayıda karakter içerir, bu yüzden bunu bir kenara bırakalım.

Ancak not defteri bile LE, BE veya UTF-8 yapabilir

Ve not defteri bir yana, UTF-8 bir Malzeme Listesi ile veya olmadan olabilir.

Ve Cygwin ile Windows'u kullanıyorum, ancak Windows bağlantı noktaları \ r \ n belirttiğinizde bile bunu yapabilir \ n \ Bunu gördük.

Belirli bir işletim sisteminin kodladığı Unicode'un kullandığı tek bir kural yoktur. Olsaydı çok esnek bir işletim sistemi olmazdı.

Farklılıkları gerçekten görmek için, yazılımın bir kodlama kodunun kullandığı veya sunduğu şeyleri bilir.

Cygwin ve xxd ve / veya onaltılık bir düzenleyici edinin ve dosyanın içinde gerçekten ne olduğuna bakın. Bir dosyayı tanımlamaya yardımcı olması için 'dosya' komutunu kullanın. O zaman aslında UTF 16bit LE'nin ne olduğunu görüyorsunuz. UTF 16bit BE nedir. UTF-8 nedir (ve UTF-8 bir Malzeme Listesi ile veya bir Malzeme Listesi olmadan olabilir).

Bazen not defterine unicode olarak kaydetmesini söyleyebilirsiniz (bu not defteri unicode 16 bit küçük endian anlamına gelir) ve olmayacaktır. Ama arial unicode gibi bir unicode yazı tipi seçin ve charmap bazı unicode karakterleri kopyalayın ve olacak .. Ve ne not defteri veya ne yazılım ne yaptığını görmek için iyi bir yol, bir dosyanın onaltılık bakarak

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.

Dd komutu (windows içindeki cygwin'den çalıştırdığım * nix komutu) değiştirebilir

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>

Ve not defteri kendisi UTF-16 Big Endian veya UTF-16 Little Endian veya UTF-8 olarak kaydedebilir

resim açıklamasını buraya girin

Teknik bir kişiyseniz ya da sadece bir not defteri kullanıcısıysanız, işletim sisteminiz nedeniyle bir kodlamaya bağlı değilsiniz!

UTF-8'in UTF-16'dan daha mantıklı olduğunu düşünüyorum, UTF-16 sadece 8 bit'e ihtiyaç duyan karakterler için bile 16 bit kullanacaktır. Yine de, charmap'in UTF-16 kodunu gösterdiğini unutmayın.

Sublime (Windows metin düzenleyicisi), unicode'u varsayılan olarak UTF-8 olarak kaydeder.

Windows ve bazen unicode kullanıyorum ve çoğunlukla UTF-8 kullanıyorum.

Ve Windows teknik olarak esnek olduğu için, linux en azından teknik olarak esnektir!


Komutları fileve typeCygwin isteminin içine yazdınız mı?
Vesnog

xxdve typevarsaydığım standart Cygwin kurulumunda komutlar eksik. Bunun dışında sonuçlarınızı tekrarlamak istiyorum.
Vesnog

1
@Vesnog type, cmd.exe'de yerleşik olarak bulunan standart bir komuttur xxd, büyük olasılıkla varsayılan olarak cygwin ile yüklenmez, ancak cygwin'i yükledikten sonra veya sonra, cygwin kurulumunu başlatırsanız cygwin'de kullanmak için yükleyebileceğiniz uzun bir komut listesi alırsınız, ve cygwin kurulum arama kutusuna xxd yazmanız yeterlidir. xxd ayrıca vim7'nin kurulumundan sonra da kullanılabilir, böylece oradan da alabilirsiniz.
barlop

1
@Vesnog, cygwin içinde veya cygwin dışında cygwin komutlarını çalıştırabilirsiniz. Bunları cygwin dışında çalıştırırsanız c:\cygwin\bin, yolunuza (cygwin'in bin alt dizininin olduğu yer) ekleyin. Ayrıca 'type' veya 'dir' gibi herhangi bir dahili cmd komutu veya calc.exe (windows hesap makinesi) gibi herhangi bir harici exe cygwin içinden çalıştırılabilir / başlatılabilir. Cygwin'den çalıştırılabilecek hemen hemen her şey cmd'den çalıştırılabilir ve tersi de geçerlidir. Eğer bash kullanmak istiyorsanız, cygwin kullanın ve tekli çift tırnaklı sorunlarla karşılaşırsanız, cmg içinde cygwin ve cmd içindeki cygwin komutlarını çalıştırın.
barlop

1
@Vesnog xxd de bir dosya yazabilir, örneğin echo 61|xxd -r -p>a.adaha sonra deneyin type a.a Yani gerçekten xxd -p ile bir bayt dökümü alabilir, baytları yeniden düzenleyebilir veya değiştirebilir ve sonra xxd -r -p'ye besleyebilir ve farklı bir kodlama ile yeni bir farklı dosya alabilirsiniz veya eski verilere dayalı farklı veriler. "Dosya" komutu, baytlara dayalı olarak kodlamayı buluyor.
barlop

-1

Linux UTF-8 kullanır ve her karakter 1 ile 4 bayt arasında, 1 ile 4 bayt arasında değildir.

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

Bu zaten 2011 yılında gönderilen bir cevapta belirtildi.
Ramhound
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.