.. Данные, передаваемые через сокет ... должны быть в кодировке utf-8 ..
Это не совсем так.
Сокет может передавать только байты и, следовательно, ему нужно получать байты. Строка - это не последовательность байтов, а последовательность символов. Чтобы передать строку через сокет, она должна быть сначала представлена в виде последовательности байтов и декодирована обратно после передачи. Если у вас уже есть байты (например, двоичное представление изображения), дополнительное кодирование и декодирование не требуется.
Существуют различные способы представления символов в виде байтов, «кодировка символов». UTF-8 - это одна из этих кодировок, где английские символы занимают только один байт, большинство символов западных языков занимают не более 2 байтов и т. Д. Существуют другие кодировки, такие как UTF-32, где все символы занимают 4 байта, или ISO-8859-15, где все символы занимают только один байт, но могут представлять только символы, найденные в западных языках.
Из-за небольших накладных расходов для западных языков UTF-8 зарекомендовал себя как наиболее распространенная кодировка символов. Но вы также можете использовать UTF-32 или другие, если вы используете одну и ту же кодировку как для отправки (кодирования), так и для приема (декодирования).
Для получения дополнительной информации я рекомендую прочитать Абсолютный минимум, который должен знать каждый разработчик программного обеспечения Абсолютно, положительно должен знать о Unicode и наборах символов (без оправданий!) .