Windows 7 UTF-8 ve Unicode


13

Birisi lütfen Windows 7'de (Pro 64-bit) neyin değiştiğini açıklayabilir mi?

Ayrıntılar: Önceden Windows XP'ye sahiptim ve CSV biçiminde bazı çeviri dosyaları (UTF-8 kodlu) vardı. Yazı tiplerini hem Not Defteri'nde hem de Excel'de görüntüleyebildim. Windows 7'ye yükselttikten sonra, bu dosyaları açtığımda - tek gördüğüm kare kutular (sadece, tarayıcıda açarsam - tüm çeviriyi görebildim). Bu dosyaları Unicode'a kaydedersem, her şey yolunda görünüyor.

Peki tam olarak neler oluyor? Windows 7 neden Unicode ile çalışıyor ve UTF-8 ile çalışmıyor?

Yanıtlar:


29

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-endianve 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, IsTextUnicodeverilere 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 Encodingseç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 .


3
Wikipedia'ya göre : Windows Vista ve Windows 7'de [..] IsTextUnicode UTF-16LE yerine bayt tabanlı bir kodlamayı tahmin etmeyi çok daha olası kılacak şekilde değiştirildi.
Arjan,

Evet, tabii ki bu dosyaları BOM'a sahibiz, çünkü biz BOM ile bu dosyayı oluşturduk. Windows 7'nin eski işletim sistemi tarafından oluşturulan ürün reçetesini okumaması ilginçtir.
Sha Le

BOM değişmedi. Dosyalarınızın BOM'u eksik olabilir, ancak önceden varsayılan biçiminin, şu anda ASCII olduğu bazı Unicode varyantı olmasıydı. Cevabımı gör.
harrymc

@Sha Le: Dosyanın BOM varsa, Windows 7 Not Defteri'nin doğru açması gerekir, bu yüzden açıkladığınız problem bilinen sorunlara uymuyor isTextUnicode. BOM içeren bir dosyada yaşadığınız sorunu gösteren küçük bir örnek dosya oluşturabilir misiniz?
RedGrittyBrick

Orada da this app can breakaynı etki içinBush hid the facts
Regent

3

Not: Kodlama menüsünü kullanarak, tez dosyalarını görüntülemek için Not Defteri ++ kullanabilirsiniz .

Dosyalar doğru şekilde görüntülendiğinde, kaydedilmeleri doğru Malzeme Listesini ekleyecektir.


Bu yazının biraz eski olduğunu biliyorum, ancak şu anda dosyalar başlangıçta notepad ++ v5.9.6.2 kullanılarak oluşturulan BOM'suz UTF 8'i görüntülememesi nedeniyle win 7 ve notepad ++ ile ilgili bir sorunum yok.
Jake

@Jake: "BOM olmadan UTF8'de kodla" yerine Kodlama menüsünün "UTF8'de Kodla" gösterdiğinden emin olun.
harrymc
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.