BOM ile UTF-16 üreten iconv


11

Bu sorudan esinlenerek iconv, bir BOM ve belirtilen endianness ile UTF-16 çıktısı oluşturmak için komutu kullanabilir miyim ?

iconvBaşka bir kodlama gelen komut dönüştürür metni.

Örneğin:

echo hello | iconv -f ascii -t utf-16

UTF-16 temsili üretir "hello\n".

UTF-16 dosyaları genellikle, ancak her zaman değil, Unicode karakterinin 2 baytlık kodlaması olan bir Bayt Sırası İşareti (BOM) ile başlar U+FEFF. İlk iki bayt olup olmadığını kontrol ederek BOM ile UTF-16 dosyanın endianness'ın belirleyebilir FE FFveya FF FE.

iconvKomut UTF-16 çıkışını üretmek için çeşitli seçenekler vardır:

$ iconv --list | grep -i utf-16
UTF-16//
UTF-16BE//
UTF-16LE//

Bu komut:

echo hello | iconv -f ascii -t utf-16be

BOM olmadan big-endian UTF-16 üretir ; endianness'ı belirttiyseniz, çıktıda belirtmeniz gerekmediği varsayılmaktadır. Benzer şekilde, utf-16leBOM olmadan küçük endian UTF-16 üretir.

Bu:

echo hello | iconv -f ascii -t utf-16

BOM ile küçük endian UTF-16 üretir (benim x86 Ubuntu sistemimde) - ama küçük bir endian sistemde bile bir BOM ile big endian UTF-16 üreten benzer bir komutun bir raporunu gördüm.

BOM'u her zaman manuel olarak kullanabilir utf-16beveya utf-16lebaşa başlayabilirim , ancak sadece iconvkomutu kullanan bir çözüm arıyorum .

Başka bir geçici çözüm, eğer sen endian biliyor -t utf-16üretir şöyledir:

echo hello | iconv -f ascii -t utf-16 | dd conv=swab 2>/dev/null

Ne kullanmak istiyorum gibi bir şey:

iconv -f ascii -t utf-16bebom # big-endian with BOM
iconv -f ascii -t utf-16lebom # little-endian with BOM

ama iconvbunu desteklemiyor.

DÜZENLE :

X86 Mac OSX sistemine erişimi olan biri aşağıdaki komutun (kopyala-yapıştır) çıktısını gösteren bir yorum gönderebilir mi?

echo hello | iconv -f ascii -t utf-16 | od -x

1
Bir malzeme listesi verilerin taşınabilirliğini azaltır, ancak bu şekilde ekleyebilirsiniz
RedGrittyBrick

@RedGrittyBrick: Taşınabilirliği nasıl azaltır (özellikle UtF-16 için)? BOM'u açıkça üretebileceğimi biliyorum; Ben sadece bunu kullanarak bir yol arıyorum iconv- ve neden -t utf-16endianness belirtilmemiş bırakmak gibi görünüyor merak ediyorum .
Keith Thompson

Açıkça belirtmezseniz iconv, mevcut platform bayt sırasını varsayar. Pencereler dışındaki bazı platformlarda, bazı metin işleme araçları BOM'leri beklemez ve bu yüzden yanlış bir şey yapar. Örnek olarak metin dosyaları birleştirilirken veya içerik oluşturmak için dosya tabanlı şablonlar kullanılır. "IANA kayıtlı karakter kümeleri UTF-16BE ve UTF-16LE için, bu karakter kümelerinin adları zaten bayt sırasını belirlediğinden bayt sırası işareti kullanılmamalıdır"
RedGrittyBrick

Bu soru , iconv -f UTF-8 -t UTF-16biraz endian bir sistemde (MacOS) çalışarak, çok garip görünen bir BOM ile big-endian UTF-16 ürettiğini gösteriyor.
Keith Thompson

Yanıtlar:


9

Hayır , bayt sırasını belirtirseniz, iconvbir Malzeme Listesi eklemez.

Bu Unicode Konsorsiyumu'ndan

S: Malzeme Listeleri ile nasıl başa çıkmalıyım?

C: İzlenmesi gereken bazı yönergeler:

  1. Belirli bir protokol (örneğin .txt dosyaları için Microsoft kuralları) BOM'un dosyalar gibi belirli Unicode veri akışlarında kullanılmasını gerektirebilir. Böyle bir protokole uymanız gerektiğinde bir ürün ağacı kullanın.
  2. Bazı protokoller, etiketsiz metin durumunda isteğe bağlı Malzeme Listelerine izin verir. Bu durumlarda,
    • Metin veri akışının düz metin olduğu, ancak bilinmeyen kodlaması olduğu bilinen yerlerde, Malzeme Listesi imza olarak kullanılabilir. BOM yoksa, kodlama herhangi bir şey olabilir.
    • Metin veri akışının düz Unicode metin olduğu biliniyorsa (ancak hangi endian değil), BOM bir imza olarak kullanılabilir. Malzeme Listesi yoksa, metin big-endian olarak yorumlanmalıdır.
  3. Bazı bayt tabanlı protokoller, dosyanın başında ASCII karakterleri bekler. Bu protokollerle UTF-8 kullanılırsa, ürün ağacını kodlama formu imzası olarak kullanmaktan kaçınılmalıdır.
  4. Veri akışının kesin türü bilindiğinde (örn. Unicode big-endian veya Unicode little-endian), BOM kullanılmamalıdır. Özel olarak, bir veri akışı bildirilen her UTF-16BE UTF-16LE UTF-32BE olması veya UTF-32LE BOM olmamalıdır kullanılabilir.

(benim vurgum)

Ben bekliyoruz iconvbu yönergelere son sadık olmaya çalışıyor.


Güncelleme.

Bir tartışma

Bence:

  1. Ürün ağacı belirtme seçeneği kesinlikle iconv için yararlı bir ek özellik olacaktır.

  2. BOM olmadan bir UTF-16LE dosyası olduğunu bazen ek çaba ile de olsa, Windows kullanılabilir. Örneğin, Not Defteri'nin Dosya Açma iletişim kutusu, Microsoft'un "UTF-16LE" için adı olan ve (şaşırtıcı olmayan şekilde) ürün ağacı olmayan dosyalar üzerinde çalışıyor gibi görünen "Unicode" u seçmenizi sağlar.

  3. Windows Not Defteri'nde (XP) bir UTF-16LE test dosyasını (BOM'suz) veya UTF-8 test dosyasını (BOM'suz) normalde örneğin explorer'da dosyanın adını çift tıklatarak açabilirim. Bu benim için kullanışlı görünüyor. Bazen Windows'un kodlamayı yanlış tahmin edeceğini biliyorum - Bu durumda dosyayı açarken Not Defteri'ne kodlamayı söylemelisiniz. Bu rahatsızlık, Windows'da kullanılması amaçlanan metin dosyaları için bir Malzeme Listesinin dahil edilmesinin tercih edildiği anlamına gelir.

  4. Belirli bir uygulama BOM ile bir UTF-16LE dosyası dışında bir şeyle çalışmazsa, o zaman belirli bir uygulama için BOM'sız bir UTF-16LE dosyasının kullanılamayacağını kabul ediyorum.

  5. Ben şüpheli eğer UTF-8 (BOM olmadan) ile her şeyi çalışması yapabilir, uzun vadede en iyi çözümdür.

Ancak " BOM ve belirtilen endianness ile UTF-16 çıktısı oluşturmak için iconv komutunu kullanabilir miyim " sorusunun cevabı şu anda " Hayır " dır .


1
Peki ya ilk kılavuz A.1? Bir x86, Windows sistemi üzerinde kullanılabilir olan bir Unicode metin dosyası oluşturmak istiyorum f ise, bir küçük endian UTF16 dosyası olmalıdır bir BOM ile .
Keith Thompson

@KeithThompson: Sistemler hem UTF16LE hem de UTF16BE'yi kabul etmelidir. .txtDosya en az BOM olduğu sürece , en azından Windows Not Defteri her ikisini de kabul eder .
user1686

@KeithThompson: 1. kılavuzun öncelik taşıması gerektiğine katılıyorum, ancak iconv bir Malzeme Listesi belirlemeniz için bir yol sunmuyor. Orijinal sorunuzun cevabı sadece "Hayır" dır.
RedGrittyBrick

Umduğum cevap değil, bir cevap ve kapsamlı bir cevap!
Keith Thompson

2
Bu cevap bana yardımcı oldu - neden vidalandığımı öğrenmeme yardımcı oldu. Standart Windows Program kayıt defterinden ihracata / ithalat, C:\Windows\System32\reg.exeihracat UTF-16 LE İLE BOM ve olacak sadece UTF-16 okumak LE İLE BOM - okumazlar UTF-16 LE olmadan BOM ve olmayacaktır UTF-16 davranışsal deneyi okumak BOM ile - başka bir deyişle, kitap okurken ürün ağacını talep eder, ancak doğru olan daha iyi olur! (Neyse ki UTF-8 okuyor.)
davidbak
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.