Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
44 / 7 / 1
Регистрация: 05.08.2013
Сообщений: 60

Кодировка UTF8

08.10.2019, 09:57. Показов 4830. Ответов 44
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребят, занят созданием чата. Кто-нибудь может подсказать, почему кодировка отдельных символов отображается знаками вопроса?
Миниатюры
Кодировка UTF8  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.10.2019, 09:57
Ответы с готовыми решениями:

Кодировка из dos в utf8
я пишу программку по раздаче wifi которая работает через консоль, при работе программы нужно вывести из консоли то что она выводит но...

Как в richTextBox открыть файл с кодировкой UTF8
Создан проект с названием 1. в результате создается папка 1, папка Debug, файл 1 - тип файла VC++ Intellisense Database и 1 тип файла...

Кодировка UTF8
Создаю файл с расширением txt. Не знаю как с кодировкой UTF8 записать символ новой строки.FileStream file =new...

44
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
10.10.2019, 11:03
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от PsiMagistr Посмотреть сообщение
Эти 4 байта тоже надо в цикле считывать?
Разумеется.
В 99.9999% случаев они прилетят сразу, да еще и с куском текста, но на оставшиеся 0.0001% лучше обезопаситься.
0
44 / 7 / 1
Регистрация: 05.08.2013
Сообщений: 60
10.10.2019, 13:49  [ТС]
Немного я все-таки не допонимаю.

Эти 4 байта, нужно каким-то образом (непонятно каким) прикреплять сразу к тексту и слать через один send?
Или делать два send? один массив байтов отправляет, другой строки?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
10.10.2019, 13:52
Цитата Сообщение от PsiMagistr Посмотреть сообщение
Или делать два send?
Вот это.

C#
1
2
3
var bytes = Encoding.UTF8.GetBytes(txtMessage.Text);
_serverSocket.Send(BitConverter.GetBytes(bytes.Length));
_serverSocket.Send(bytes);
1
44 / 7 / 1
Регистрация: 05.08.2013
Сообщений: 60
10.10.2019, 14:28  [ТС]
И тогда нужно делать два считывающих цикла. Один который байты считывает, другой сами строки?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var bt = new byte[3] //Массив из четырех байт 0-3
 
 
                  do
                    {                       
                        size = _handler.Receive(bt);                      
                       // Что-то должно быть здесь, но что именно? Как считать байты?
                    } while (_handler.Available > 0);
 
 
                   var length = BitConverter.ToInt32(); //Конвертируем
 
                   var buffer = new byte[length]; //Массив с длиной, равной длине сообщения.
 
 
                  //Прием сообщения
 
 
                  do
                    {                       
                        size = _handler.Receive(buffer);                      
                        data.Append(Encoding.UTF8.GetString(buffer, 0, size));
                    } while (_handler.Available > 0);
0
 Аватар для Lexeq
1151 / 743 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
10.10.2019, 15:13
PsiMagistr, писал в блокноте, может где ошибся, ну и получение n байт стоит вынести в метод. А вообще, было бы проще перейти на чуть более высокий уровень абстракции и читать/писать байты используя TcpClient + BinaryReader/BinaryWriter.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var bt = new byte[4] //Вот теперь из четырех байт 0-3
//получаем размер сообщения
int recived = 0;
do
{                       
    recived += _handler.Receive(bt, recived, 4 - recived, SocketFlags.None);                      
} while (recived < 4);
var length = BitConverter.ToInt32(bt); //Конвертируем
 
//получаем тело сообщения
var buffer = new byte[length]; //Массив с длиной, равной длине сообщения.
recived = 0;
do
{                       
    recived += _handler.Receive(buffer, recived, length - recived, SocketFlags.None);                      
} while (recived < length);
 
var message =  Encoding.UTF8.GetString(buffer);
0
44 / 7 / 1
Регистрация: 05.08.2013
Сообщений: 60
10.10.2019, 21:19  [ТС]
Спасибо большое. Буду пытаться

Добавлено через 5 часов 5 минут
Lexeq, кастати, а два цикла приемника будут работать?
Если мы например принимаем первый send, а в это время уже второй идет. Или там какая то очередь?
0
548 / 355 / 120
Регистрация: 17.08.2014
Сообщений: 1,351
10.10.2019, 21:32
PsiMagistr, насколько я понимаю обертка соккетов идет поверх нативных. поэтому прием и отправка сообщений происходит самостоятельно с каким то буффером. Если это не так, то тогда каждый метод ресив вернет все что было отправлено на удаленом хосте и именно в том порядке в котором было отправлено. И если какой то затуп произойдет по приему данных то соккет на удаленном хосте отвалится по таймауту приема данных.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
10.10.2019, 22:37
Цитата Сообщение от PsiMagistr Посмотреть сообщение
Если мы например принимаем первый send, а в это время уже второй идет.
Протокол TCP гарантирует, что данные придут в том же порядке, в котором они были отправлены.
1
548 / 355 / 120
Регистрация: 17.08.2014
Сообщений: 1,351
10.10.2019, 22:50
kolorotur, Можете пояснить как в таком случае склеивать пакеты udp, помимо размера еще передавать номер пакета??
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
10.10.2019, 22:55
Andreyip, да, как вариант.
UDP, как правило, используется там, где потери допустимы и получение 105-го пакета после 118-го не страшно - его можно выбросить
1
44 / 7 / 1
Регистрация: 05.08.2013
Сообщений: 60
13.10.2019, 11:59  [ТС]
Друзья, пытаюсь разобраться в одной вещи:

Клиент передает:

C#
1
2
3
var bytes = Encoding.UTF8.GetBytes("<setname>Павел");
               _serverSocket.Send(BitConverter.GetBytes(bytes.Length));  //Байтовая размерность             
               _serverSocket.Send(Encoding.UTF8.GetBytes("<setname>Павел")); //Сообщение
Сервер принимает данные и рассылает по всем клиентам (в потоках)

Intовый Битоприемник размерности сообщений в клиенте (подсказан уважаемым товарищем Lexeq за что огромное спасибо:

C#
1
2
3
4
5
6
7
8
9
10
11
int length = 0;
                var size = 0;
                int recived = 0;
                var bt = new byte[4];
                do
                {
                    recived += _serverSocket.Receive(bt, recived, 4 - recived, SocketFlags.None);
 
                } while (recived < 4);
 
                length = BitConverter.ToInt32(bt, 0);

Так вот при отправке сообщения "<setname>Павел" в length выдаю его длину выходит 18 байтов

В то время как конвертеры на сайтах выдают длину 19 байт и сам шарповский BitConverter тоже, если просто декодировать:


C#
1
2
3
byte[] b = Encoding.UTF8.GetBytes("<setname>Павел");
var btt = BitConverter.GetBytes(b.Length);
var num = BitConverter.ToInt32(btt, 0);
19 байтов

Но в чате нет потерь данных! Все строки отображаются совершенно нормально, даже при объемных сообщениях. Длины же их варьируются и отличаются от длин, выдаваемых стандарт-конвертерами.


Всем всем большое спасибо заранее. И товарищу kolorotur тоже

Добавлено через 14 минут
Например при такой фразе:

"Павел пишет: Привет"

У меня длина 37 байт. Стандартный декодировщик выдает 36.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
13.10.2019, 12:38
PsiMagistr, покажите полный код передачи и приема сообщений.

Цитата Сообщение от PsiMagistr Посмотреть сообщение
Клиент передает
Зачем в третьей строчке снова конвертировать текст в байты, если это уже сделано двумя строками выше?
0
44 / 7 / 1
Регистрация: 05.08.2013
Сообщений: 60
13.10.2019, 12:43  [ТС]
Так вроде не в байты, а в число.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
13.10.2019, 12:44
Цитата Сообщение от PsiMagistr Посмотреть сообщение
Так вроде не в байты, а в число.
Что не в байты, а в число?

Добавлено через 20 секунд
Я, если что, вот про этот кусок кода:
C#
1
2
3
var bytes = Encoding.UTF8.GetBytes("<setname>Павел");
               _serverSocket.Send(BitConverter.GetBytes(bytes.Length));  //Байтовая размерность             
               _serverSocket.Send(Encoding.UTF8.GetBytes("<setname>Павел")); //Сообщение
1
44 / 7 / 1
Регистрация: 05.08.2013
Сообщений: 60
13.10.2019, 13:18  [ТС]
Прием с клиента

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
 private void listener() //Тут
{
            
            while (true)
            {
                int length = 0;
                var size = 0;
                int recived = 0;
                var bt = new byte[4];
                do
                {
                    recived += _serverSocket.Receive(bt, recived, 4 - recived, SocketFlags.None);
 
                } while (recived < 4);
 
                length = BitConverter.ToInt32(bt, 0);                
                if (length > 0)
                {
                    try
                    {
                        MessageBox.Show(length.ToString());
                        var buffer = new byte[length];
                        size = 0;
                        var data = new StringBuilder();
                        do
                        {
                            size = _serverSocket.Receive(buffer);
                            data.Append(Encoding.UTF8.GetString(buffer, 0, size));
                        } while (_serverSocket.Available > 0);
 
                        //  MessageBox.Show("Вышел2");
 
                        if (InvokeRequired)
                        {
                            Invoke(new Action(() =>
                            {
                                if (data.ToString().Contains("<loader>"))
                                {
                                    var d = data.ToString().Remove(0, 8);
                                    users.Items.Clear();
                                    string[] names = d.Split('>');
                                    foreach (var name in names)
                                    {
                                        users.Items.Add(name);
                                    }
                                    var bytes = Encoding.UTF8.GetBytes("<shalom>");
                                    _serverSocket.Send(BitConverter.GetBytes(bytes.Length));
                                    _serverSocket.Send(bytes); //Тут                                                                                               
                                }
                                else /*if (data.ToString().Contains("<msg>"))*/
                                {
                                    Chat.Text = String.Empty;
                                    Chat.Text = data.ToString();
                                }
 
                            }));
                        }
 
                    }
                    catch (Exception ex)
                    {
                        if (InvokeRequired)
                        {
                            Invoke(new Action(() =>
                            {
                                Chat.Text = ex.Message;
                            }));
                        }
                    }
 
                }                      
            
            }
}
Отправка с клиента

C#
1
2
3
4
5
 var bytes = Encoding.UTF8.GetBytes(Name + " пишет: " + txtMessage.Text);             
            _serverSocket.Send(BitConverter.GetBytes(bytes.Length));
            _serverSocket.Send(bytes);
            txtMessage.Text = String.Empty;
            txtMessage.Focus();
Прием с сервера

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 while (start)
            {
                int length = 0;
                var size = 0;
                int recived = 0;
                var bt = new byte[4]; 
                do
                {
                  recived +=  _handler.Receive(bt, recived, 4 - recived, SocketFlags.None);
                } while (recived < 4);
                
                length = BitConverter.ToInt32(bt, 0);              
                var buffer = new byte[length];                                
                try
                {                  
                    var data = new StringBuilder();
                    do
                    {                        
                        size = _handler.Receive(buffer);                      
                        data.Append(Encoding.UTF8.GetString(buffer, 0, size));
                    } while (_handler.Available > 0);                                    
                    Server.Commands(this, data.ToString());              
                 
                }
                catch(Exception ex)
                {                    
                    Server.CloseUser(this);
                    Console.WriteLine("Проблема слушателя клиента " + ex.Message);
                }
C#
1
2
3
4
5
6
7
8
 public static void sendToAll(string data)
        {                         
                foreach (var user in users)
                {
                    user.sendMessage(data);
                }
                            
        }
Добавлено через 21 минуту
Поправлю, спасибо.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
13.10.2019, 13:28
PsiMagistr, не вижу причин, по которым отсылающий и принимающий код получали бы разное количество байт.
Правда, прием сообщения у вас все еще неправильно реализован — его надо так же в цикле получать, как это делалось с количеством байт.
0
44 / 7 / 1
Регистрация: 05.08.2013
Сообщений: 60
13.10.2019, 13:47  [ТС]
Так он в цикле

C#
1
2
3
4
5
do
                        {
                            size = _serverSocket.Receive(buffer);
                            data.Append(Encoding.UTF8.GetString(buffer, 0, size));
                        } while (_serverSocket.Available > 0);
Они по видимому получают одинаковое кол. байт. Просто это количество не совпадает с количеством, которое выдает стандартный кодировщик онлайн. И даже сам BitConverter, если его просто заставить перекодировать эту строчку в число.

Визуально потерь данных не происходит... Кракозябр нет.

Добавлено через 1 минуту
"<setname>Павел"

Например вот эта строчка выдает 18 байт. А вроде как должно быть 19.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
13.10.2019, 14:18
Цитата Сообщение от PsiMagistr Посмотреть сообщение
Они по видимому получают одинаковое кол. байт.
Может вы просто смотрите куда-то не туда?

Цитата Сообщение от PsiMagistr Посмотреть сообщение
Так он в цикле
Нет, цикл должен быть устроен так же, как для считывания количества байтов.
Товарищ Lexeq на предыдущей странице показал как.
0
44 / 7 / 1
Регистрация: 05.08.2013
Сообщений: 60
13.10.2019, 14:46  [ТС]
kolorotur, Скажите пожалуйста, а перевод строки возврат каретки чему равен байтах UTF8? Два байта?
Я кажется разобрался в причинах феномена.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
13.10.2019, 14:49
Цитата Сообщение от PsiMagistr Посмотреть сообщение
а перевод строки возврат каретки чему равен байтах UTF8? Два байта?
Смотря что используется в качестве перевода строки.
Если \r\n, то два байта, если \n, то один.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.10.2019, 14:49

из utf8 в cp1251
Всем привет ! Собственно сразу вопрос - как троку перекодировать из utf8 в cp1251 и обратно ? Желательно стандартными классами ...

NetworkStream UTF8
Здравствуйте. Произвожу чтение данных посредством NetworkStream bytes_read=Stream-&gt;Read(data,0,data-&gt;length); Сцепляю буфер в...

Преобразовать Multibyte в UTF8
У меня есть фаил строки в котором в кодировке Мультибайт, каким образом их можно преобразовать в UTF8?

Как юникод в utf8 перевести?
Здравствуйте, форумчане, в общем, проблема! Нужна срочная помощь. Помогите пожалуйста. На выходе с программы имеем код в юникоде: ...

Десятичное представление символа UTF8
Есть задача преобразовать строку кодировки 1251 в UTF8, а затем представить строку (посимвольно) кодировки UTF8 в десятичном...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
После закрытия оутлука продолжает висеть процесс в диспетчере задач
Maks 27.10.2026
С недавнего времени в продакшене возникла проблема: при закрытии оутлука в диспетчере задач продолжал висеть процесс outlook. exe. Проблема возникла после установки MS Office 2021 LTSC на машинах, под. . .
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него. https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952 Инструкция внутри. https:/ / youtu. be/ VpfFZSUDGnQ. . .
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru