"UTF-8 ANSI" nedir

4 Cevap php

I made a PHP script that generates CSV files that were previously generated by another process. And then, the CSV files have to be imported by yet another process.

Eski CSV dosyalarını alma çalışıyor, ama ancak yeni CSV dosyalarını içe özel karakterler ile ilgili sorunlar vardır.

Ben Notepad + + ile eski CSV'leri açtığınızda, kodlama UTF-8 olduğunu söylüyor, ve ben onunla yeni CSV'leri açtığınızda, onların kodlama 'UTF-8 ANSI' diyor.

Iki fark nedir?

Ve nasıl fopen yapmak ve fputcsv kullanabilir 'saf?' UTF-8 kodlaması kullanıyor?

Teşekkürler!

4 Cevap

Dosyası ile yanlış bir şey yok. "UTF-8 ANSI" hiçbir BOM ama Notepad + + kesinlikle bayt kalıplarını analiz ederek UTF-8 olarak kodlamasını tespit demektir. Ben Rusça, Yunanca ve içinde Polonyalı metin ile bir dosya oluşturmak ve BOM olmadan UTF-8 olarak kaydedip bu test. İşte:

# Russian
Следующая

# Greek
Επόμενη

# Polish
Więcej

Ben farklı bir editör (EditPad Pro) bu yaptım ve emin BOM yoktu yapmak için altıgen modunu kullandık. Ben NPP açtı zaman "UTF-8 olarak ANSI" olarak kodlama gösterdi ve tüm karakterler doğru görüntülenir. Sonra, hala hex modunda, ben ilk Rus karakterin ilk baytı kaldırıldı. Ben tekrar NPP açıldığında, o "ANSI" olarak kodlama gösterdi ve mojibake olarak metnin ASCII olmayan parçaları görüntülenen:

; Russian
¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ

; Greek
Επόμενη

; Polish
Więcej

Geri EditPad, ve bu kez ben bir Reçetesi eklendi ama Kiril karakteri tamir etmedi. Aşağıda gösterildiği gibi bu kez NPP, "UTF-8" ve bu ilk Rus karakteri dışındaki düzgün görüntülenen her şey gibi kodlama bildirdi. "A1" UTF-8 bu karakterin ikinci bayt olması gereken ne onaltılık temsilidir. Bir hata olduğunu belirten bir ters renk düzeni sergilendi.

# Russian
A1ледующая

# Greek
Επόμενη

# Polish
Więcej

Özetlemek gerekirse: bir BOM yokluğunda, Notepad + + değerleri 127'den büyük olan (veya 7F hex) çünkü ASCII karakterleri temsil edemez bayt arar. Herhangi bulur, ama hepsi gerekli desenleri uyuyorsa UTF-8, UTF-8 olarak dosyayı çözer ve "UTF-8 olarak ANSI" olarak durum çubuğunda kodlama bildirir.

Bu ayak, UTF-8 hattı yok, hatta bir bayt bulursa Ama temel platform için varsayılan tek bayt kodlama, yani "ANSI" olarak dosyayı çözer. Dosya bozuk olsaydı, o gördüğünüz ne olacağını bulunuyor.

EDIT: Dosya onsuz geçerli olmasına rağmen, could elle dosyanın başında "EF BB BF" üç bayt yazarak bir Reçetesi eklemek - ama daha iyi bir yolu olmalı . Nasıl şimdi içerik üreten? Çünkü is UTF-8, oralarda bir yerde en az bir non-ASCII karakter ile; Aksi takdirde, NPP "ANSI" olarak rapor verecek.

CSV dosyasını tüketir süreci üzerinde herhangi bir etkisi varsa, belki UTF-8 BOM olmadan beklemek için yapılandırabilirsiniz: düşünülmesi gereken bir olasılık. Teknik olarak, with bir BOM UTF-8 deşifre edemem ama herhangi bir yazılım without biri kırık. Unicode Konsorsiyumu aslında UTF-8 BOM kullanımını teşvik etmemektedir, kimsenin dinleme değil.

Notepad + + ile ilgili iş parçacığı here ve here göre, 'ANSI UTF-8 olarak' UTF-8 without BOM, gösterir iken bir düz 'UTF-8' BOM ile UTF-8 demektir. Yani belki CSV okuma işlemi doğru UTF-8 olarak CSV okumak için Byte-order mark ihtiyacı vardır.

Ama girmeden önce, aslında script UTF-8 yazıyor emin olun! Not Defteri'nde + + ile yeni CSV'leri açın (ve 'UTF-8 ANSI' diyor), tüm 'özel' karakterler doğru görüntülenir? Değilse, aslında evet ise, BOM farkı kontrol, UTF-8 yazmak için komut uyum gerekir.

Çok UTF-8 için PHP komut değiştirmeyi deneyin. Bazen veri aynı karakter kodlama script olması (o atlanabilir rağmen) gereklidir.

Benzer sorun: http://stackoverflow.com/questions/1371216/php-explode-using-special-characters

Bu UTF-8 olarak PHP dosyalarınızı biçimlendirme eğer UTF-8 ANSI, yani UTF-8 BOM olmadan yararlı olduğunu fazlalaştı. PHP dosyası tarayıcıya html çıktısı sonra BOM w3c validator açıkça karşı uyardı HTML çıktısında yer almaktadır:

Byte-Order Mark found in UTF-8 File.

UTF-8 kodlanmış dosyaları Unicode Byte-Order Mark (BOM), bazı metin editörleri ve eski tarayıcılar için sorunlara neden olduğu bilinmektedir. Bunu daha iyi desteklenen kadar kullanımı kaçınarak düşünebilirsiniz.

Bunun ötesinde, ben BOM şimdi tüm <head> içeriği <body> etiketi aslında olduğunu düşünüyor Firefox'un Firebug kafasını karıştıracaktır gördü.