代码之家  ›  专栏  ›  技术社区  ›  Stefan Steiger Marco van de Voort

是否可以检测到UDP响应编码?

  •  1
  • Stefan Steiger Marco van de Voort  · 技术社区  · 16 年前

    问题:

    我通过UDP查询Quake3主服务器,得到如下响应。 如您所见,我很难确定服务器发送的内容的编码… 有没有办法检测或设置接收编码?

                baBuffer = new byte[1024*100]; // 100 kb should be enough
            int recv = sctServerConnection.ReceiveFrom(baBuffer, ref tmpRemote);
    
            Console.WriteLine("Message received from {0}:", tmpRemote.ToString());
    
            System.Text.Encoding encResponseEncoding = System.Text.Encoding.Default; // Wrong...
            //encResponseEncoding = System.Text.Encoding.ASCII;
            //encResponseEncoding = System.Text.Encoding.UTF8;
            //encResponseEncoding = System.Text.Encoding.GetEncoding(437); // ANSI-DOS
            //encResponseEncoding = System.Text.Encoding.GetEncoding(1252);// ANSI-WestEurope
            //encResponseEncoding = System.Text.Encoding.GetEncoding(1250); // Ansi-Centraleuro
            //encResponseEncoding = System.Text.Encoding.GetEncoding("ISO-8859-1");
            //encResponseEncoding = System.Text.Encoding.GetEncoding("ISO-8859-9");
            //encResponseEncoding = System.Text.Encoding.UTF32;
            encResponseEncoding = System.Text.Encoding.UTF7; // Bingo !
    
    3 回复  |  直到 16 年前
        1
  •  1
  •   Hans Passant    16 年前

    编码(如果实际是文本)由协议决定。如果您没有协议规范,也没有源代码,那么,是的,您必须进行猜测。

        2
  •  1
  •   Community Mohan Dere    8 年前

    没有办法安全地检测编码,您可以猜测它。也见 How can I detect the encoding/codepage of a text file .

        3
  •  1
  •   Chris Haas    16 年前

    你可以找 Byte Order Mark (BOM) . 下面是我使用的一些vb.net代码:

    Private Shared Function GetStringFromBytes(ByVal bytes() As Byte) As String
        Dim ByteLegth = bytes.Count
        If (ByteLegth >= 3) AndAlso (bytes(0) = &HEF) AndAlso (bytes(1) = &HBB) AndAlso (bytes(2) = &HBF) Then
            Return System.Text.Encoding.UTF8.GetString(bytes)
        ElseIf (ByteLegth >= 2) AndAlso (bytes(0) = &HFE) AndAlso (bytes(1) = &HFF) Then
            Return System.Text.Encoding.BigEndianUnicode.GetString(bytes)
        ElseIf (ByteLegth >= 2) AndAlso (bytes(0) = &HFF) AndAlso (bytes(1) = &HFE) Then
            Return System.Text.Encoding.Unicode.GetString(bytes)
        ElseIf (ByteLegth >= 2) AndAlso (bytes(0) = &H0) AndAlso (bytes(1) = &H0) AndAlso (bytes(2) = &HFE) AndAlso (bytes(3) = &HFF) Then
            Return New System.Text.UTF32Encoding(True, True).GetString(bytes)
        ElseIf (ByteLegth >= 2) AndAlso (bytes(0) = &HFF) AndAlso (bytes(1) = &HFE) AndAlso (bytes(2) = &H0) AndAlso (bytes(3) = &H0) Then
            Return System.Text.Encoding.UTF32.GetString(bytes)
        Else
            'No BOM, assume ASCII
            Return System.Text.Encoding.ASCII.GetString(bytes)
        End If
    End Function