In [129]: source = '\xe3\xc7\x9f'
In [130]: source.decode('cp1256')
Out[130]: u'\u0645\u0627\u06ba'
In [131]: destination
Out[131]: u'\u0645\u0627\u06ba'
PS. Вопрос «Какой кодек превращает этот объект str в этот объект Unicode?» время от времени возникает на SO. Вот небольшой скрипт, который может помочь быстро ответить на эти вопросы (он просто пытается декодировать объект str
с каждой возможной кодировкой):
guess_encoding.py:
import binascii
import zlib
import codecs
import pkgutil
import os
import encodings
def all_encodings():
modnames=set([modname for importer, modname, ispkg in pkgutil.walk_packages(
path=[os.path.dirname(encodings.__file__)], prefix='')])
aliases=set(encodings.aliases.aliases.values())
return modnames.union(aliases)
def main():
encodings=all_encodings()
while 1:
text=raw_input()
text=codecs.escape_decode(text)[0]
# print('Attempting to decode {0!r}'.format(text))
for enc in encodings:
try:
msg=text.decode(enc)
except (IOError,UnicodeDecodeError,LookupError,
TypeError,ValueError,binascii.Error,zlib.error) as err:
pass
# print('{e} failed: {err}'.format(e=enc,err=err))
else:
if msg:
print('Decoding with {enc}:'.format(enc=enc))
print(msg)
if __name__=='__main__':
main()
После запуска guess_encoding.py
вы набираете repr
объекта str
:
% guess_encoding.py
\xe3\xc7\x9f
Он выплевывает связанный объект Unicode относительно каждой возможной кодировки Python.
Поскольку вы сказали нам, что желаемый объект Unicode был
In [128]: print(destination)
ماں
вы можете быстро найти выход для
ماں
и найдите успешный кодек:
Decoding with cp1256:
ماں