2012-11-29 6 views
5

varsayılan dökme: "\\U+1043\\U+1072\\U+1073\\U+1072\\U+1088\\U+1080\\U+1090\\U+1085\\U+1086\\U+1089\\U+1090\\U+1100"metin kod türünü belirlemek ve ben, yani yabancı kodlama sisteminde bir giriş dizesi

Ve ben varsayılan kod sistemine (System.Text.Encoding.Default) için döküm istiyorum:

-  System.Text.Encoding.Default {System.Text.SBCSCodePageEncoding} System.Text.Encoding {System.Text.SBCSCodePageEncoding} 
+  [System.Text.SBCSCodePageEncoding] {System.Text.SBCSCodePageEncoding} System.Text.SBCSCodePageEncoding 
     BodyName "koi8-r" string 
     CodePage 1251 int 
+  DecoderFallback {System.Text.InternalDecoderBestFitFallback} System.Text.DecoderFallback {System.Text.InternalDecoderBestFitFallback} 
+  EncoderFallback {System.Text.InternalEncoderBestFitFallback} System.Text.EncoderFallback {System.Text.InternalEncoderBestFitFallback} 
     EncodingName "Cyrillic (Windows)" string 
     HeaderName "windows-1251" string 
     IsBrowserDisplay true bool 
     IsBrowserSave true bool 
     IsMailNewsDisplay true bool 
     IsMailNewsSave true bool 
     IsReadOnly true bool 
     IsSingleByte true bool 
     WebName "windows-1251" string 
     WindowsCodePage 1251 int 

Kod sistemini nasıl belirleyebilirim ve nasıl yayınlayabilirim?

+0

Başarılı bir dönüştürme işleminden sonra dosyanın veya dosyanın bir bölümünün neleri içermesi gerektiğini biliyor musunuz? – Jodrell

+0

alien tarafından, başka bir bilinmeyen kodlama – Jodrell

+0

> tarafından yabancı, başka bir bilinmeyen kodlama var demektir evet – psct

cevap

11

Sorunuzu gerçekten anladığımdan emin değilim.

.NET'te, bir string nesnesine sahip olduğunuzda, farklı kodlamaları önemsemenize gerek yoktur. Tüm .NET dizeleri aynı kodlamayı kullanır: Unicode (veya daha kesin olarak: UTF-16).

Farklı metin kodlamaları yalnızca bir dize nesnesini bir bayt dizisine dönüştürdüğünüzde (ör., Bir metin dosyasına yazmak için) veya tam tersi olarak oynatılır. Bunun hakkında konuştuğunu varsayıyorum. başka bir kodlama Bir bayt dizisi dönüştürmek için, yazabilirsiniz: Elbette

byte[] input = ReadInput(); // e.g. from a file 
Encoding decoder = Encoding.GetEncoding("encoding of input"); 
string str = decoder.GetString(input); 
Encoding encoder = Encoding.GetEncoding("encoding of output"); 
byte[] ouput = encoder.GetBytes(str); 

Doğru kodlama adları ile encoding of input ve encoding of output değiştirmeniz gerekir. MSDN, bir list of all supported encodings sahiptir.

Girdinin kodlamasını, sözleşmeyle veya meta verilere veya başka bir şeye göre bilmeniz gerekir. Bilinmeyen bir kodlamayı güvenilir bir şekilde belirleyemezsiniz/tahmin edemezsiniz, ancak uygulayabileceğiniz bazı hileler ve sezgisel yollar vardır. Bakınız How can I detect the encoding/codepage of a text file.

Düzenleme:

"U + xxxx" genellikle belirli bir Unicode kod noktasına (Unicode bir karakter için numarası) bakın nasıl olduğu, ör "A" harfinin (Latin sermayesi A) kod noktası U + 0041'dir.

Girdi dizginiz aslında "\\U+1043..." (ters eğik çizgi, ters eğik çizgi, başkent U vb.) Veya yalnızca bu örn. bir hata ayıklayıcı penceresinde Birincisi o zaman birileri metnin kodlanması sırasında bir hata yaptı, belki bir Unicode edebi yazmaya çalışarak ve tersine iki kere yazarak ters eğik çizgi kaçarak (Edit2: Ya da karakterleri yazmak için kasıtlı olarak kurtarıldı) ASCII kodlu bir dosya/akış/etc). Bildiğim kadarıyla, .NET kodlama sınıfları burada size yardımcı olmaz; dizeyi elle ayrıştırmanız gerekir.

Bu arada, örneğinizdeki sayılar tuhaf. Standart gösterimde, "U +" 'dan sonraki sayı bir onluk sayı değil, bir onaltılık sayıdır. Fakat kod noktalarını hex numaraları olarak okursanız, tamamen ilgisiz komut sistemlerinden (Burma, Gürcü Mkhedruli, Hangul Jamo) gelen karakterleri ifade ederler; Her ne kadar hepsi Kiril harflerine atıfta bulunurlar.

Edit3:, bu kod noktası (Char.ConvertFromUtf32(n)) ile bir char oluşturmak, bir int n için xxxx dönüştürmek (x bir rakam olmak) biçiminde \\U+xxxx yılında altdizgelerin aramaya, iyi, bunu ayrıştırmak ve bütünü değiştirmek için Bu char tarafından substring.

+0

tamam, çok düşündüm, teşekkür ederim. – psct

+0

üzgünüm, ama ben sorunu çözemedim. UTF-16'nın varsayılan olarak .Net olduğunu ancak System.Text.Encoding.Default'un neden koi8-r olduğunu yazıyorsunuz? Ya da sadece Net olmayan dizeler için kullanılır ve utf-16'ya dönüştürmek yerine? Yani, "\\ U + 1043 ..." dizgisini belirlemek için problemlerim var, lütfen bana yardımcı olabilir misiniz (cp1251, utf-8/16, koi8-r ve birkaç tane emacs deniyorum ama yapamadım uygun bulundu mu? – psct

+1

@psct: Hayır, UTF-16 varsayılan kodlama değil, .NET dizelerinin dahili kodlaması. Varsayılan kodlama, sisteminizin kültür ayarlarına bağlıdır. –

İlgili konular