44 lines
1.1 KiB
Python
44 lines
1.1 KiB
Python
|
"""
|
||
|
convert_utf7_to_utf8 used in nametrans
|
||
|
|
||
|
Main code: Rodolfo García Peñas (kix) @thekix
|
||
|
Updated regex by @dnebauer
|
||
|
|
||
|
Please, check https://github.com/OfflineIMAP/offlineimap3/issues/23
|
||
|
for more info.
|
||
|
"""
|
||
|
import re
|
||
|
|
||
|
|
||
|
def convert_utf7_to_utf8(str_imap):
|
||
|
"""
|
||
|
This function converts an IMAP_UTF-7 string object to UTF-8.
|
||
|
It first replaces the ampersand (&) character with plus character (+)
|
||
|
in the cases of UTF-7 character and then decode the string to utf-8.
|
||
|
|
||
|
If the str_imap string is already UTF-8, return it.
|
||
|
|
||
|
For example, "abc&AK4-D" is translated to "abc+AK4-D"
|
||
|
and then, to "abc@D"
|
||
|
|
||
|
Example code:
|
||
|
my_string = "abc&AK4-D"
|
||
|
print(convert_utf7_to_utf8(my_string))
|
||
|
|
||
|
Args:
|
||
|
bytes_imap: IMAP UTF7 string
|
||
|
|
||
|
Returns: UTF-8 string
|
||
|
|
||
|
Source: https://github.com/OfflineIMAP/offlineimap3/issues/23
|
||
|
|
||
|
"""
|
||
|
try:
|
||
|
str_utf7 = re.sub(r'&(\w{3}\-)', '+\\1', str_imap)
|
||
|
str_utf8 = str_utf7.encode('utf-8').decode('utf_7')
|
||
|
return str_utf8
|
||
|
except UnicodeDecodeError:
|
||
|
# error decoding because already utf-8, so return original string
|
||
|
return str_imap
|
||
|
|