Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/29: Рейтинг темы: голосов - 29, средняя оценка - 4.66
2 / 2 / 1
Регистрация: 09.01.2015
Сообщений: 383

Символы � при декодировании utf8 кириллицы

27.04.2018, 02:36. Показов 6155. Ответов 6

Студворк — интернет-сервис помощи студентам
Добрый день ! У меня всплыл косяк . когда принимаю пакет байт и конвертирую в utf8 . Иногда кириллица отображается ��.
Причем одно и то же сообщение и каждый раз по разному .
C#
1
2
3
4
5
            while (socket.Available > 0)
            {
                bytes = socket.Receive(data, data.Length, SocketFlags.None);
                packet += Encoding.UTF8.GetString(data, 0, bytes);
            }
Добавлено через 7 минут
Пример :
<B X="284" Y="237" Z="2" name="166" txt="Разрушенный Лабиринт" N="0" layer="8"/>
<B X="693" Y="287" Z="3" name="167" txt="Разр��шенная Мэрия" N="0" layer="8"/>
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.04.2018, 02:36
Ответы с готовыми решениями:

� вместо кириллицы при передаче GET запроса
Здравствуйте. При передаче GET запроса формируется заголовок сайта. Если ввожу в адресную строку site.ru/?title=мой заголовок, то все...

снова про кодировку, utf8 джÑ�к
есть несколько полей вида: &lt;input type=&quot;text&quot; name=&quot;login&quot; maxlength=&quot;40&quot; value=&quot;&lt;?php echo htmlentities($login);?&gt;&quot;/&gt; переменная...

TCP обмен java->vb появляются символы �
сервер - консольное приложение написан на vb клиент - планшет на андроид написан на java (кодировка UTF-8) 1. открываю файл .csv и...

6
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
27.04.2018, 10:42
Marchcat,
Во-первых, вы неправильно принимаете данные. Свойство socket.Available нельзя применять для определения наличия данных.
Во-вторых, причина из-за которой у вас бьется кодировка следующая: в UTF-8 символ может состоять из нескольких (2 и более) байт. Теперь представим ситуацию, когда ваш сокет принял данные и пакет оборвался прямо между этими двумя байтами. Что произойдет на выходе? Encoding не сможет декодировать последний символ, и не сможет декодировать первый символ следующего пакета. Вот у вас мы и видим два подряд идущих битых символа.
Что делать?

1) Вместо Socket нужно использовать TcpClient (либо WWW если уж вы в юнити работаете). У TcpClient есть метод получения потока данных GetStream().

2) Поверх потока нужно повесить StreamReader с кодировкой UTF-8. И вот из него уже читать ваш текст. В таком случае StreamReader никогда не разобъет символ пополам и чтение будет корректным.
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18240 / 14154 / 5366
Регистрация: 17.03.2014
Сообщений: 28,841
Записей в блоге: 1
27.04.2018, 11:10
Marchcat, UTF-8 - многобайтовая кодировка и следовательно конвертировать байты в символы можно только получения всех данных или по крайней мере всех байтов достаточных для декодирования каждого символа. При передаче по сети данные могут прийти частями и привести к подобной ошибке. Смотри решения в теме Кодировка и Клиент-серверное приложение. Передача строки без потери данных
1
 Аватар для Cr0c
753 / 600 / 204
Регистрация: 06.08.2015
Сообщений: 2,432
27.04.2018, 15:43
Storm23, сокеты разве не по tcp идут?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
27.04.2018, 15:50
Цитата Сообщение от Cr0c Посмотреть сообщение
сокеты разве не по tcp идут?
Разве я где-то писал что сокеты не могут работать с tcp?
Просто свойство Available показывает лишь число пришедших в данный момент байт и не может использоваться для определения того что пакет принят целиком.
Ну и TcpClient просто удобнее.
0
2 / 2 / 1
Регистрация: 09.01.2015
Сообщений: 383
27.04.2018, 19:24  [ТС]
Приходит все нормально . Тут проблема именно с тем что UTF8 с BOD или нет . Возможно надо поменять кодировку . Про этот косяк с кириллицей на забугорных форумах много описано . Я спрашиваю про то кто и как с этим боролся

Добавлено через 56 секунд
Я для того пример и скинул . что одно и то же слово отображается нормально , а потом нет .

Добавлено через 26 минут
При чем это проблема только с кириллицей

Добавлено через 2 часа 28 минут
Да ! Вы были правы , походу проблема была в дроблении . Но почему срабатывало только на кириллице не понятно . Хотя что кириллица что латиница кодируются 2 байтами . Вот у меня и остался вопрос почему латиница в норме , а кириллица через Ж..
На скорую руку прикрутить костылик для проверки
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
    public void ReceiveData() // Прием 
    {
        byte[] data = new byte[256]; // Размер буфера 
        int bytes = 0; // Кол-во считанных байт 
        string packet = ""; // Строка для хранения пакета 
        List<byte> builder = new List<byte>();
 
        while (socket.Connected)
        {
            while (socket.Available > 0)
            {
                bytes = socket.Receive(data, data.Length, SocketFlags.None);
                if (bytes > 0)
                {
                    for (int i = 0; i < bytes; i++)
                    {
                        builder.Add(data[i]);
                    }
                }
 
            }
 
            if (builder.Count > 1)
            {
                if (builder[builder.Count - 1] == Convert.ToChar(0x00)) // Если у нас что - то есть и оно заканчивается на 0x00 
                {
 
                    packet = Encoding.UTF8.GetString(builder.ToArray(), 0, builder.Count);
                    packet = packet.Replace("\x0D" + "\x0A", "");
 
                    Execute(() => { transiver(packet); });
                    builder.Clear();
                    packet = ""; // Обнуляем 
                }
            }
        }
    }
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18240 / 14154 / 5366
Регистрация: 17.03.2014
Сообщений: 28,841
Записей в блоге: 1
27.04.2018, 19:33
Цитата Сообщение от Marchcat Посмотреть сообщение
Хотя что кириллица что латиница кодируются 2 байтами .
Вот именно что в UFT-8 латиница кодируется одним байтом (для совместимости с ASCII), а кириллица двумя.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.04.2018, 19:33
Помогаю со студенческими работами здесь

Заглавные символы кириллицы заменить на строчные латинские символы
Здравствуйте!Помогите пожалуйста решить вот эту задачку в Far менеджере.=(Заранее очень вам благодарна. Задача.Заглавные символы...

Ошибка при декодировании
Здравствуйте. Подскажите почему TOAD ругается на decode? А поменять decode на case я не могу потому что запрос составлял не я. Но в Golden...

Ошибка при декодировании в TransformFinalBlock
Доброго времени суток! Возникла такая проблема, не могу понять как разрешить Есть два метода: шифрование и дешифровка. Шифрует...

Нарушение кодировки при декодировании base64
Здравствуйте. Прошу гуру Java помочь мне со следующей проблемкой: Декодирую base 64 при помощи этого кода: if (x == null) ...

Утечка памяти при декодировании видео
Доброго времени суток! Пишу плеер видео, на этапе декодирования кадров и их вывода столкнулся с утечкой памяти. Понял, что эта утечка...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru