SORU
27 Mart 2009, Cuma


Nasıl UTF-8 dizesi Visual C 2008 literal oluşturmak için

VC 2003, kaynak UTF-8 olarak kaydedin ve tüm dizeleri olarak kullanılmıştır. Diğer bir deyişle, aşağıdaki kodu konsola olarak dizeleri yazdıracak. Eğer kaynak dosya UTF-8 olarak kaydedilmiş çıktı UTF-8 olacaktır.

printf("Chinese (Traditional)");
printf("中国語 (繁体)");
printf("중국어 (번체)");
printf("Chinês (Tradicional)");

UTF-8 BOM ile UTF-8 formatında dosya kurtardım. Ancak VC2008 sonuçları ile derleme:

warning C4566: character represented by universal-character-name '\uC911' 
cannot be represented in the current code page (932)
warning C4566: character represented by universal-character-name '\uAD6D' 
cannot be represented in the current code page (932)
etc.

Karakterleri bu uyarılar neden bozuk. Yerel (bu durumda 932 = Japon) uygun olanları yerel kodlama dönüştürülür, yani Shift-JIS.

Yapamam VC 2008 benim için bu derlemek için almak için bir yol bulmak. Kaynak dosyası kullanıyorum ne olduğu önemli değil unutmayın. Yazan bir ayar olması gibi bir şey yok "ne yaptığımı biliyorum, sakın f$%##ng dize benim rakamları değiştirmek". Özellikle UTF-8 pseudo-yerel işe yaramaz çalışmıyor.

#pragma setlocale(".65001") 
=> error C2175: '.65001' : invalid locale

Ne "C":

#pragma setlocale("C") 
=> see warnings above (in particular locale is still 932)

VC2008 (veya varsayılan) belirtilen yerel tüm karakterlerin güçleri ve yerel olamaz UTF-8 olacak gibi görünüyor. Dosyayı "\\x11... aynı kaynaktan derlendi çünkü" kullanarak oldukça mutlu UTF-8 dosyaları ile başa çıkabilirim hangi gcc. xbf gibi kaçış dizeleri kullanmak için değiştirmek istemiyorum

Kaynak dosyanın derleme dize hazır değiştirlmesini gerektiğini belirtmek için herhangi bir yolu var mı?

Farklı bir şekilde sormak, bayraklar kaynak dosyayı derlerken geri VC2003 ile uyumluluk belirlemek için kullanın derleme. yani dize hazır değiştirmeyin, olduğu gibi onlara bayt bayt için kullanın.

Güncelleme

Önerileriniz için teşekkürler, ama wchar önlemek istiyorum. Bu uygulama UTF-8 dizeleri Sadece ile ilgili olduğundan, wchar kullanarak benim tüm dizeleri geri gereksiz olması gereken UTF-8 dönüştürmek gerekir. Giriş, çıkış ve iç işlem tüm UTF-8. Linux üzerinde gayet iyi çalışıyor ve VC2003 derlenmiş basit bir uygulama. VC2008 ile aynı uygulamayı derleyin ve iş sahibi olmak istiyorum.

Bunun için VC2008 benim yerel makine yerel (Japon, 932) dönüştürmek için denemek için ihtiyacım var. VC2008 VC2003 ile uyumlu olmasını istiyorum. Dizeleri opak aslında olduğu gibi, karakter dizileri gibi, ya da UTF-8 olarak kullanılır diyor yerel ya da derleyici bir ayar istiyorum. VC2003 ile sıkışmış olabilir gibi görünüyor, VC2008 olsa gcc bu durumda çok akıllı olmaya çalışıyor.

CEVAP
30 Mart 2009, PAZARTESİ


Güncelleme:

Bunu yapmak için garantili bir yolu yoktur, hiçbir karar verdim. Aşağıda sunduğum çözüm Japon versiyonu VC2003 (ya da belki de Japon OS) ile derleme VC2003, ama başarısız İngilizce sürümü için çalışıyor. Her durumda, işe bağlı olamaz. Hatta L gibi her şeyi bildirmek unutmayın"" dizeleri işe yaramadı (ve aşağıda açıklandığı gibi gcc acı).

Bunun yerine sadece mermi ısırık ve bir veri dosyası içine tüm metin taşı ve oradan yüklemek gerekiyor sanırım. Şimdi ve SimpleIni (cross-platform INI dosya kitaplığı) INI dosyaları metin depolama erişiyorum. En azından tüm metin program Dışı olarak çalışan bir garantisi yoktur.

Özgün:

Evan sorunu anlamak için ortaya beri sadece kendim cevap veriyorum. Cevaplar Unicode ve wchar_t nasıl kullanılacağı ile ilgili bu uluslararası, ne de Unicode yanlış anlama, karakter kodlamaları ile ilgili değil bu sorun için geçerli değildir. Yardım etmeye çalışıyorsun ama, eğer yeterince açık değilse özür dilerim takdir ediyorum.

Sorun platformları ve uygulamaları çeşitli altında çapraz derlenmesi gereken kaynak dosyaları var. Program, UTF-8 işlem yapar. Diğer kodlamalar hakkında hiçbir şey umurunda değil. Şu anda gcc ve vc2003 ile çalışır gibi UTF-8 dize hazır bilgi vermek istiyorum. Nasıl VC2008 ile yapacağım? (geriye dönük uyumlu çözüm yani).

Bu bulduğum şey:

gcc (v4.3.2 20081105):

  • dize hazır bilgi (ham dizeleri) olarak kullanılır
  • destekler UTF-8 kaynak dosyaları kodlanmış
  • kaynak UTF-8 BOM olmamalıdır dosyaları

vc2003:

  • dize hazır bilgi (ham dizeleri) olarak kullanılır
  • destekler UTF-8 kaynak dosyaları kodlanmış
  • kaynak dosyaları olabilir veya UTF-8 BOM olmayabilir (fark etmez)

vc2005 :

  • dize hazır derleyici (ham dizeleri) ile masaj yapılır
  • char dize hazır bilgi, belirli bir yerel ayar için yeniden kodlandı
  • UTF-8 hedef yerel olarak desteklenmiyor
  • kaynak UTF-8 BOM olması gerekir dosyaları

Bu yüzden, basit bir cevap bu yaptıklarınızın, VC2005 kırık olduğu ve geriye dönük derleme bir yol sağlamaz. Derlenmiş programın içine Unicode dize getirmenin tek yolu tüm dizeleri geri UTF-8 kullan zamanda dönüştürmek gerekiyor demektir UTF-8 ile BOM wchar.

Örneğin, UTF-8, wchar dönüştürme çapraz platform herhangi basit bir yöntem yok, ne boyutu ve kodlama wchar. Windows, UTF-16. Diğer platformlarda? Değişir. Bazı ayrıntılar için ICU project bkz.

Sonunda tüm Derleyiciler aşağıdaki gibi kaynak ile vc2005 dışında dönüşüm maliyeti önlemek karar verdim.

#if defined(_MSC_VER) && _MSC_VER > 1310
// Visual C   2005 and later require the source files in UTF-8, and all strings 
// to be encoded as wchar_t otherwise the strings will be converted into the 
// local multibyte encoding and cause errors. To use a wchar_t as UTF-8, these 
// strings then need to be convert back to UTF-8. This function is just a rough 
// example of how to do this.
# define utf8(str)  ConvertToUTF8(L##str)
const char * ConvertToUTF8(const wchar_t * pStr) {
    static char szBuf[1024];
    WideCharToMultiByte(CP_UTF8, 0, pStr, -1, szBuf, sizeof(szBuf), NULL, NULL);
    return szBuf;
}
#else
// Visual C   2003 and gcc will use the string literals as is, so the files 
// should be saved as UTF-8. gcc requires the files to not have a UTF-8 BOM.
# define utf8(str)  str
#endif

Bu kod basit bir örnek olduğuna dikkat edin. Üretim kullanımı çeşitli şekillerde (iş parçacığı güvenli, hata denetimi, tampon boyutunu denetler, vs.) temizlemek gerekir.

Bu aşağıdaki kod gibi kullanılır. Temiz derler ve doğru gcc, vc2003 ve vc2008 benim testlerde çalışır:

std::string mText;
mText = utf8("Chinese (Traditional)");
mText = utf8("中国語 (繁体)");
mText = utf8("중국어 (번체)");
mText = utf8("Chinês (Tradicional)");

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jonathan D.

    Jonathan D.

    3 Kasım 2006
  • Menglong Tav

    Menglong Tav

    18 Temmuz 2010
  • TheDigiCraft

    TheDigiCraft

    25 NİSAN 2011