@kaktak255

Проблемы с кодировкой, как исправить?

Есть вот такой код который преобразует текст в цифры:
def bins_str(text):
	ASCII_BITS = 8
	def to_bin(c):
		return bin(ord(c))[2:].zfill(ASCII_BITS)

	return ''.join(to_bin(c) for c in text)

inputString = "текст"

bin_str = int(bins_str(inputString), 2) #   результат -  19184738688437314

И код который делает тоже самое но в обратную сторону:
def int_to_text(number):
	ASCII_BITS = 8
	bin_str = bin(number)[2:]
	pad = '0' * (ASCII_BITS - len(bin_str) % ASCII_BITS)
	bin_str = pad + bin_str

	chars = []
	for i in range(0, len(bin_str), ASCII_BITS):
		bin_part = bin_str[i: i + ASCII_BITS]
		c = chr(int(bin_part, 2))
		chars.append(c)

	return ''.join(chars)

asd = int_to_text(19184738688437314)  #  результат  -   D(k¢B , а должно быть  -  текст

В общем что то не так с кодировкой , и только с русскими символами , если использовать английские то все нормально
  • Вопрос задан
  • 81 просмотр
Пригласить эксперта
Ответы на вопрос 2
@galaxy
В python3 строки - юникодные, ord(c) возвращает unicode код символа, который только для ASCII символов будет в диапазоне 0-255 (0-127, точнее, 128-255 - расширенная латиница). Для кириллицы код занимает 2 байта.

Я не очень понимаю, что вы вообще делаете. Если конкретизируете, что именно за число должно быть, можно написать код (скорее всего, с гораздо меньшими извращениями).
Ответ написан
Комментировать
Записывайте. Даю удочку. Рассказываю, как дебажить:

Смотрите каждое промежуточное и думайте, корректное оно или нет.

Если действие сложное, развивайте на части поменьше.
У вас вообще прямая функция и обратная. Это значит вы просто должны увидеть, в каком месте они начинают различаться.

Например, подайте на вход прямой функции текст "D(k¢B"...

А вообще, да. bin(ord(русска_буква)) будет больше чем 8 символов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы