2012-10-26 151 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