2013-01-04 26 views
10

Üzerinde çalıştığım projede, oldukça az sayıda dizeyle ilgileniyorum; dizeler, ikili dosyalardan kodlamalarıyla birlikte (tek veya çift bayt olabilir) okunur. Aslında, dize değerini vector<char> olarak okuyorum, kodlamayı okudum ve tüm dizeleri tutarlılık için wstring'a dönüştürüyorum.Unicode dosya adı C++ ile ikili dosya nasıl okunur?

Bu, oldukça iyi çalışır, ancak dosya adları çift baytlı karakter olabilir. Giriş akışını gerçekten nasıl açacağım konusunda çok şaşırdım. C içinde wchar_t* path'u geçen _wfopen işlevini kullanırdım, ancak wifstream farklı şekilde davranıyor gibi görünüyor, çünkü çift baytlık bir dosyadan tek bayt okumak için değil, bir dosyadan çift baytlı karakterleri okumak için özel olarak tasarlanmıştır.

Bu sorunun çözümü nedir?

Düzenleme: Ağda arama yapılması, standart C++ 'da hiç destek görmüyor gibi görünüyor (ör. Bkz. this discussion). Ancak, C++ 11'in gerçekten bu alanda yararlı bir şey ekleyip eklemediğini merak ediyorum.

+0

'wchar_t' ve' wstring' kullanmaktan kaçınıyorum çünkü 'wchar_t' derleyicilerde taşınabilir değildir (VC++’da 16 bit, gcc’de 32 bit). C++ 11, char16_t ve char32_t türlerini tanıtır, ancak açıkçası kendiniz yazabilirsiniz. –

+0

@Matthieu M. VC++ ile ilgili endişelerim yok, çünkü zaten benim hedef derleyicilerimden biri değil. İlk olarak unix tabanlı sistemlerde çalışan kodları almam gerekiyor. –

+0

İşte aynı soru ama sadece pencereler için: [Bir Unicode dosya adıyla std :: fstream (ofstream veya ifstream) nasıl açılır?] (Http://stackoverflow.com/q/821873/33499) Unix sistemlerinde – wimh

cevap

1

Açmak için geçirdiğiniz dize, dosya adına eşlenmiş olarak nasıl oluşturulur uygulama bağımlı. Bir Unix ortamında, neredeyse — sadece '/' ve '\0' geçirilir, özel olarak kabul edilir. Diğer ortamlarda, diğer kurallar kuraldı, ve ben , geçmişte bir sorun yaşamadım çünkü Unix'e bir dosya yazdım ve , Windows altında bir şey yapamadı (özellikle dosya adına ':' davranır) .

Bu dosyaların nereden geldiği başka bir sorudur. Yukarıdaki numaralı telefonlarda da belirtildiği üzere, onları sisteminizde açmanın kesinlikle yolu yoktur: ':' ile bir dosya adı sadece Windows'ta açılamaz. Unix'te,dosya adının kendisinde '\0' karakterleri ile sonuçlanırsanız, büyük olasılıkla bunları okuyamazsınız ve UTF16 dosya adlarının,karakterleri Unix altında görüneceklerdir. Tek çözüm, dosyaları yeniden adlandırılacak dosyaları oluşturan sisteminde yerel araçları kullanmak olabilir.

Unix disketine nasıl bu dosya adlarını ilk etapta alabiliyorsunuz? Bir Windows kutusunda sunulduğunda, Samba harita UTF16 gibi bir SMB sunucusu nasıl dosyalanır? Veya bir NFS sunucusu — Bence Windows altında da böyle şeyler var.

+0

Linux'ta, dosya adlarının UTF-8 (standart kod sayfası) ile eşleştirilmesi sürücü tarafından yapılır; bu genellikle yapılandırılabilir (yani "iocharset" seçeneği kullanılarak cifs (smb) için). – filmor