C# 特殊字符的ICQ编码

C# 特殊字符的ICQ编码,c#,character-encoding,icq,C#,Character Encoding,Icq,我正在使用ICQ协议,发现特殊字母(fxp发音符号)有问题。我使用另一种编码(CP-1251,如果我记得的话)阅读ICQ 如何用文本解码字符串以正确编码 我尝试过使用UTF8Encoding类,但没有成功 使用ICQ夏普库 private void ParseMessage (string uin, byte[] data) { ushort capabilities_length = LittleEndianBitConverter.Big.ToUInt16 (

我正在使用ICQ协议,发现特殊字母(fxp发音符号)有问题。我使用另一种编码(CP-1251,如果我记得的话)阅读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);
    }
如果使用同一个客户机联系就可以了,但如果没有,带有变音符号的传入和传出消息就无法读取

我已经确定(使用这个->)它是双字节Unicode编码。但若字符串不包含变音符号,则其不可读(中文字母)。但是,如果我在文本上使用UTF8编码而不使用变音符号,那就可以了。但我不知道如何做到这一点,它将被正确编码。

如果UTF-8有点有效(即,它适用于“英语”或任何US-ASCII字符),那么您就没有UTF-16。拉丁字母1(或Windows-1252,微软的变体)或例如Windows-1251或Windows-1250是完全可能的,因为第一部分包含的拉丁字母不带变音符号是相同的

解码如下:

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

等等,你是说,使用UTF-16,有变音符号的文本可以工作,但没有变音符号的文本不能工作?如果它适合(没有变音符号),它会使用US-ASCII,如果它包含变音符号,它会使用UTF-16吗?尝试使用as UTF-16对编码为ASCII的文本进行解码肯定会产生汉字……我已经编辑了您的标题。请看“”,其中的共识是“不,他们不应该”。这也只适用于没有变音符号的字母。如果只有一个变音字母,那么它就是不可读的。我正在使用ICQ库处理ICQ协议。我不知道它到底是如何工作的,但如果两个联系人都使用我的客户端,这没问题,但是另一个客户端可能使用了另一种编码,我有一个问题。那么,如果你使用“UTF-16”,那么它是否只适用于带有变音符号的消息?(与其他客户机通信时)是的,具有大端字节顺序的UTF 16仅适用于带有变音符号的消息(与其他客户机通信时)。我用的是CP-1251。它可以很好地处理任何东西,但是没有变音符号(如果文本中包含变音符号,它只会删除它)。但对于传入的消息,这不起作用。这真的很奇怪,我知道:D,但我只有在ICQ协议中才有这个问题。我还与Skype和XMPP合作,一切都很完美。我正在使用ICQ库。因为我还没有找到任何其他易于使用的工作。我还没有发现任何带有文档的库,ICQ也没有。肯定有办法知道传入消息的编码方式。看到这个bug报告,他们在谈论ICQ编码:据我所知,我应该检查消息是否只包含ascii字符。我已经试过了:
msg.ToCharArray().Any(c=>c>255)
如果消息包含ASCII码大于255的任何字符,则应返回。但这是行不通的。我发现fxp对于
č
的值是237,在ASCII中,我得到了另一个关于266的值。所以我不知道如何检查消息是否包含非ASCII字符?对于现在的发送,我只是将其转换为ASCII('č'->'c','š'->'s'等)。但在收到的信息中,我需要首先对其进行解码。我不知道如何检查它是文本还是一些不可读的字符。