2012-10-26 189 views
0

我正在使用ICQ協議,並發現特殊字母(fxp音調符號)的問題。我使用另一種編碼(如果我記得CP-1251)閱讀ICQ。特殊字符的ICQ編碼

如何使用文本解碼字符串以正確編碼?

我試過使用UTF8Encoding類,但沒有成功。

使用ICQ銳庫。

private void ParseMessage (string uin, byte[] data) 
    { 
     ushort capabilities_length = LittleEndianBitConverter.Big.ToUInt16 (data, 2); 
     ushort msg_tlv_length = LittleEndianBitConverter.Big.ToUInt16 (data, 6 + capabilities_length); 
     string message = Encoding.UTF8.GetString (data, 12 + capabilities_length, msg_tlv_length - 4); 

     Debug.WriteLine(message); 
    } 

如果使用相同的客戶端還是可以的,但如果不與變音符號傳入和outcoming消息只是不可讀接觸。

我已經確定(使用此 - >https://stackoverflow.com/a/12853721/846232)它是BigEndianUnicode編碼。但是如果字符串不包含變音符不可讀的(中文字母)。但是,如果我使用UTF8編碼的文本沒有變音符號,那就OK了。但我不知道該怎麼做,它會被編碼爲正確的。

+0

等待,你是說,使用UTF-16,用變音符號的工作文字,但沒有變音符號的文本不工作?難道它使用US-ASCII(如果它適合的話)(無符號)和UTF-16(如果它包含變音符號)?試圖用UTF-16解碼ASCII編碼的文本,肯定會產生中文字符... – johv

+0

我編輯過你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

1

如果UTF-8有點作用(即它適用於「英語」或任何US-ASCII字符),那麼你沒有UTF-16。 Latin1(或Windows-1252,微軟的變體)或雖然Windows-1251或Windows-1250是完全可能的,因爲這些第一部分包含沒有區分符號的拉丁字母是相同的。

解碼這樣的:

var encoding = Encoding.GetEncoding("Windows-1250"); 
string message = encoding.GetString(data, 12 + capabilities_length, msg_tlv_length - 4); 
+0

這也適用於沒有變音符號的字母。如果只有一個變音符號,它就全部無法讀取。我正在使用ICQ#庫來處理ICQ協議。我不知道它是如何工作的,但如果兩個聯繫人都使用我的客戶端,這是好事,但另一個客戶端可能使用另一種編碼,我有問題。 – sczdavos

+0

因此,如果您使用「UTF-16」代替,那麼它是否僅適用於帶有音調符號的郵件? (與其他客戶端通信時) – johv

+0

是的,具有大端字節順序的UTF 16僅適用於帶有變音符號的消息(與其他客戶端通信時)。發送我使用CP-1251。它適用於任何事情,但沒有變音符號(如果文本包含變音符號 - 它將刪除它)。但對於收到的消息,這不起作用。我知道這真的很奇怪:D但是我只有在ICQ協議中遇到這個問題。我也與Skype和XMPP合作,並且都是完美的。我正在使用ICQ#庫。原因我還沒有發現任何其他工作易於使用。而且我還沒有發現任何帶有ICQ文件的圖書館都沒有。 – sczdavos