1 Востаннє редагувалося Fox (23.02.2017 20:18:26)

Тема: BinaryReader не бачить юникод.

Маю BinaryReader який приймає даннi пiсля запиту до сервера.
Сервер вiдповiдає i все норм доки вiн не вiдповiдає на юнiкодi.
Тодi там не букв "Привiт" я якiсь символи.
Може якось можна виставити кодування ?
PS: Маю ще клиент який робить те семе що i я в свому и сервер однаковий...
Але в мене таке:
http://i.imgur.com/trNl3Zp.png?1
А там таке:
http://i.imgur.com/B1zGakl.png?1

На назву не звертайте уваги... Перший попавшийся сервер.
Допоможiть будь ласка.

2

Re: BinaryReader не бачить юникод.

Код би не завадив.

3 Востаннє редагувалося Fox (24.02.2017 11:50:17)

Re: BinaryReader не бачить юникод.

Torbins написав:

Код би не завадив.

Використання

Query sQuery = null;
sQuery = new Query(IP, 7777);
sQuery.Send('i');
int count = sQuery.Receive();
string[] info = sQuery.Store(count);

Клас

class Query
    {
        Socket qSocket;
        IPAddress address;
        int _port = 0;

        string[] results;
        int _count = 0;

        DateTime[] timestamp = new DateTime[2];

        public Query(string IP, int port)
        {
            qSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

            qSocket.SendTimeout = 5000;
            qSocket.ReceiveTimeout = 1000;

            try
            {
                address = Dns.GetHostAddresses(IP)[0];
            }

            catch
            {

            }

            _port = port;
        }

        public bool Send(char opcode)
        {
            try
            {
                EndPoint endpoint = new IPEndPoint(address, _port);

                using (MemoryStream stream = new MemoryStream())
                {
                    using (BinaryWriter writer = new BinaryWriter(stream))
                    {
                        writer.Write("SAMP".ToCharArray());

                        string[] SplitIP = address.ToString().Split('.');

                        writer.Write(Convert.ToByte(Convert.ToInt32(SplitIP[0])));
                        writer.Write(Convert.ToByte(Convert.ToInt32(SplitIP[1])));
                        writer.Write(Convert.ToByte(Convert.ToInt32(SplitIP[2])));
                        writer.Write(Convert.ToByte(Convert.ToInt32(SplitIP[3])));

                        writer.Write((ushort)_port);

                        writer.Write(opcode);

                        if (opcode == 'p')
                            writer.Write("8493".ToCharArray());

                        timestamp[0] = DateTime.Now;
                    }

                    if (qSocket.SendTo(stream.ToArray(), endpoint) > 0)
                        return true;
                }
            }

            catch
            {
                return false;
            }

            return false;
        }

        public int Receive()
        {
            try
            {
                _count = 0;

                EndPoint endpoint = new IPEndPoint(address, _port);

                byte[] rBuffer = new byte[3402];
                qSocket.ReceiveFrom(rBuffer, ref endpoint);

                timestamp[1] = DateTime.Now;

                using (MemoryStream stream = new MemoryStream(rBuffer))
                {
                    using (BinaryReader reader = new BinaryReader(stream))
                    {
                        if (stream.Length <= 10)
                            return _count;

                        reader.ReadBytes(10);

                        switch (reader.ReadChar())
                        {
                            case 'i': // Information
                                {
                                    results = new string[6];

                                    results[_count++] = Convert.ToString(reader.ReadByte());

                                    results[_count++] = Convert.ToString(reader.ReadInt16());

                                    results[_count++] = Convert.ToString(reader.ReadInt16());

                                    int hostnamelen = reader.ReadInt32();
                                    results[_count++] = new string(reader.ReadChars(hostnamelen));

                                    int gamemodelen = reader.ReadInt32();
                                    results[_count++] = new string(reader.ReadChars(gamemodelen));

                                    int mapnamelen = reader.ReadInt32();
                                    results[_count++] = new string(reader.ReadChars(mapnamelen));

                                    return _count;
                                }
                            default:
                                return _count;
                        }
                    }
                }
            }

            catch
            {
                return _count;
            }
        }

4

Re: BinaryReader не бачить юникод.

vtorgashov
У конструктора BinaryReader є декілька віріантів. Один з них дозволяє вказати потрібний Encoding. Якщо використати конструктор з одним параметром (як у вас), то буде UTF-8.

5

Re: BinaryReader не бачить юникод.

Torbins написав:

vtorgashov
У конструктора BinaryReader є декілька віріантів. Один з них дозволяє вказати потрібний Encoding. Якщо використати конструктор з одним параметром (як у вас), то буде UTF-8.

Перепробував всi кодування якi там є....
Все одно чорнi ромби з бiлим знаком питання всерединi

6

Re: BinaryReader не бачить юникод.

Такий ромб (чи квадрат) зазвичай означає, що в шрифті немає відповідного символа. Який у вас шрифт?

7 Востаннє редагувалося P.Y. (24.02.2017 14:15:56)

Re: BinaryReader не бачить юникод.

Судячи з форми кракозябликів, у вас там, імовірно, вхідні дані не в utf-8, а в чомусь восьмибітному, а програма намагається прочитати це як utf-8. Варіант: програма намагається прочитати текст як чисте ascii, де символів з кодами вище 127 не передбачено (не знаю, наскільки це властиво саме C#).

Ромб — це ромб, а квадрат — це квадрат. Ромб зі знаком питання зазвичай з'являється, коли вхідні байти неможливо розкодувати в символи, а квадрат — коли справді символа немає в шрифті. Ще буває просто знак питання — коли відповідного символа нема в тому кодуванні, в яке намагаються закодувати рядок (напр., на місці літери ґ при кодуванні в ДОС-кирилицю).

8

Re: BinaryReader не бачить юникод.

koala написав:

Такий ромб (чи квадрат) зазвичай означає, що в шрифті немає відповідного символа. Який у вас шрифт?

Microsoft Sans Serif; 8,25pt

9 Востаннє редагувалося P.Y. (24.02.2017 16:35:01)

Re: BinaryReader не бачить юникод.

Ще раз кажу, проблема не в шрифті, проблема в кодуванні. А судячи з того, що кількість ромбів точно відповідає кількості кириличних літер, вхідні дані збережено в чомусь восьмибітному (ймовірно, cp1251).