русские буквы в bytes python3
вчера, пытаясь создать простой socket сервер я столкнклся с не понятной мне проблемой: итак, я использую python3.8 и из программы написаной на c# получаю bytes в кодировке utf-16 и хочу вернуть то клиенту тот же текст, что он прислал, но большими буквами:
connection.send(data.upper())
#data - полученные из подуключения данные, connection - подключение полученное из socket().accept()
НО data имеет тип bytes и назад пользователю приходят увеличенные английские буквы, и не измененные русские, то есть, если пользователь прислал Привет my dear друг то назад ему придет Привет MY DEAR друг, данная проблема решается переводом bytes в strвызовом str.upper() и переводом назад в bytes, но, что делать если я хочу использовать сразу bytes?
тем более, что я могу не знать в какой кодировке я получаю от пользователя данные, и следовательно не знать как правильно перевести данные в str и обратно?
P.S. python3.8, Windows 10 64bit
Ответы (1 шт):
Нужно сначала декодировать данные из байт в строку, тогда метод upper() будет понимать, что у вас буквы, а не просто какой-то набор байт. Перед отправкой обратно закодировать в байты.
connection.send(data.decode('utf-16').upper().encode('utf-16')
Почему не работает сразу с байтами? В разных кодировках региональные алфавиты (кириллица в данном случае) могут быть представлены совершенно по-разному, в наборе байт только для латинских символов можно хоть с какой-то уверенностью сказать что это буква. Поэтому lower и upper в байтах работает только для латиницы.