Windows 7 neden Unicode ile çalışıyor ve UTF-8 ile çalışmıyor?
terminoloji
Unicode ve UTF-8 aynı şey değildir: Unicode, bir karakter kümesini (repertuar) tanımlayan ve bu karakterlerin her birine numaralar (kod noktaları) atayan bir karakter kümesidir. UTF ‑ 8, diskteki veya aktarımdaki bir Unicode karakter akışını temsil etmek için kullanılabilecek çeşitli kodlamalardan biridir . Aynı Unicode karakter akışı örneğin UTF ‑ 16, UTF ‑ 32 veya UTF ‑ 7 olarak da kodlanabilir.
Ancak, Not Defteri dahil olmak üzere "kodlama" seçenekler sunar ANSI
, Unicode
, Unicode big-endian
ve UTF-8
. Bunu yazan Microsoft geliştiricileri yanlış terimler kullandı. "Unicode" deyince büyük olasılıkla " UTF-16
küçük Endian " anlamına geliyorlar . "ANSI" deyince Kod (1252) anlamına gelir .
Microsoft Not Defteri
Microsoft'un Not Defteri'nin UTF-16'yı bir bayt sipariş işareti ( BOM ) ile yazdığını ve Notepad'in bir metin dosyasını okurken BOM'u aradığını düşünüyorum. BOM, dosyanın UTF-16 olduğunu söyler ve büyük-endian veya küçük-endian olup olmadığını gösterir.
Notepad ürün reçetesini bulamazsa, IsTextUnicode
verilere bakan ve hangi kodlamanın kullanıldığını tahmin etmeye çalışan bir kütüphane işlevini çağırır . Bazen (kaçınılmaz olarak) yanlış tahmin eder. Bazen bir "ANSI" dosyasının "Unicode" olduğunu tahmin eder. UTF-16 veya UTF-8 dosyasını Code Page 1252 olarak yorumlamaya çalışmak, yanlış glifleri göstermesine ve bazı 8 bitli değerleri veren glifleri bulamamasına neden olur - bunlar daha sonra kareler olarak gösterilir.
Harry'nin cevabında dediği gibi , Not Defteri'ne daha iyi alternatifler var. Ancak Not Defteri, bir dosyayı açarken kodlamayı açıkça seçmenize olanak tanır (tahmin etmek için Not Defteri'nden ayrılmak yerine).
Bayt Sipariş İşaretleri
Unicode konsorsiyumuna göre, Bayt Sipariş İşaretleri (BOM) isteğe bağlıdır. Ancak, Windows bazı kodlamaları birbirinden ayırmak için malzeme listesinden yararlanır.
Yani kısacası, belki de dosyalarınız bir nedenden dolayı BOM'dan yoksundur? Belki BOM yükseltme işlemi sırasında bir zaman kayboldu?
Hala kareler olarak gösterilen orijinal dosyalarınız varsa, bir BOM içerip içermediklerini görmek için bir onaltılı döküm yapabilirsiniz.
Düz metin dosyası standartları
Sorun, etkili bir şekilde olmamasıdır - düz metin dosyaları için evrensel standartlar yoktur. Bunun yerine bir takım uyumsuzluklarımız ve bilinmeyenlerimiz var.
Satır sonları nasıl işaretlendi? Bazı platformlar, Satır İadesi (CR) ve ardından Satır Beslemesi (LF) kontrol karakterlerini, bazıları sadece CR, bazıları ise LF kullanır.
Yukarıdaki sonlandırıcılar mı, ayırıcılar mı? Bu dosyanın sonunda bir etkiye sahiptir ve sorunlara yol açtığı bilinmektedir.
Sekmelerin ve diğer kontrol karakterlerinin tedavisi. Bir sekmenin, satırın başından itibaren 8 standart karakter genişliğinin katına hizalanması için kullanıldığını varsayabiliriz, ancak gerçekten bunun kesinliği yoktur. Birçok program sekme konumlarının değiştirilmesine izin verir.
Karakter seti ve Kodlama? Bunlardan hangisinin dosyadaki metin için kullanıldığını gösteren evrensel bir standart yoktur. En yakın elimizde, kodlamanın Unicode için kullanılanlardan biri olduğunu belirten bir malzeme listesi varlığını aramaktır. BOM değerinden, dosyayı okuyan program UTF-8 ve UTF-16 vb. Arasında ve UTF-16'nın Küçük-Endian ve Big-Endian çeşitlerini vs. ayırt edebilir. CP-1252 veya KOI-8 gibi başka popüler kodlamalarda kodlanmıştır.
Ve bunun gibi. Yukarıdaki meta verilerin hiçbiri metin dosyasına yazılmamıştır - bu nedenle son kullanıcı dosyayı okurken programı bilgilendirmelidir. Son kullanıcının belirli bir dosya için meta veri değerlerini bilmesi veya programlarının yanlış meta veri değerlerini kullanması riskini taşıması gerekir.
Bush gerçekleri sakladı
Bunu Windows XP'de deneyin.
- Not Defteri'ni açın.
- Yazı tipini Arial Unicode MS olarak ayarlayın. (Önce yüklemeniz gerekebilir; menüde göremiyorsanız "Daha fazla yazı tipi göster" i tıklayın.)
- "Bush gerçekleri sakladı" metnini girin.
- Seç
Save As
. Menüden Encoding
seçin ANSI
.
- Not Defteri'ni kapatın.
- (Örneğin; belgeyi Yeniden
Start
, My Recent Documents
).
- “Bush gerçekleri sakladı” yerine “桳 桳 栠 摩 敨 敨 映 捡 see göreceksiniz.
Bu IsTextUnicode
, Notepad tarafından kullanılan fonksiyonun yanlış bir şekilde ANSI (gerçekten Kod Sayfa 1252) metninin BOM olmadan Unicode UTF-16LE olduğunu tahmin ettiğini göstermektedir. Olarak kaydedilen bir dosyada BOM yok ANSI
.
Windows 7
Windows 7 ile Microsoft IsTextUnicode
, yukarıdakilerin gerçekleşmeyeceği şekilde ayarlandı . Bir malzeme listesi yokluğunda, artık ANSI'yi (CP 1252) Unicode'dan (UTF-16LE) tahmin etmek daha olasıdır. Bu nedenle, Windows-7 ile ters problemi yaşamanın daha muhtemel olacağını umuyorum: Kod puanları 255'in üzerinde olan fakat ürün reçetesiz olan Unicode karakterleri içeren bir dosyanın artık ANSI olarak tahmin edilmesi daha muhtemeldir - ve bu nedenle yanlış görüntüleniyor.
Kodlama sorunlarını önleme
Şu anda, en iyi yaklaşım her yerde UTF-8 kullanmak gibi görünüyor. İdeal olarak, tüm eski metin dosyalarını UTF-8 olarak yeniden kodlar ve yalnızca metin dosyalarını UTF-8 olarak kaydedersiniz. Bu konuda yardımcı olabilecek recode ve iconv gibi araçlar var .