如何转义字符串中的unicode特殊字符并将其写入UTF编码文件
How to escape unicode special chars in string and write it to UTF encoded file
我的目标是:
字符串如:
Bitte überprüfen Sie, ob die Dokumente erfolgreich in System eingereicht wurden, und löschen Sie dann die tatsächlichen Dokumente.
转换为:
'Bitte \u00FCberpr\u00FCfen Sie, ob die Dokumente erfolgreich in System eingereicht wurden, und l\u00F6schen Sie dann die tats\u00E4chlichen Dokumente.'
并以这种形式写入文件(UTF-8编码)。
一个简单的解决方案是 ascii():
string = 'Bitte überprüfen Sie, ob die Dokumente erfolgreich in System ' \
'eingereicht wurden, und löschen Sie dann die tatsächlichen Dokumente.'
print(ascii(string))
输出:
'Bitte \xfcberpr\xfcfen Sie, ob die Dokumente erfolgreich in System eingereicht wurden, und l\xf6schen Sie dann die tats\xe4chlichen Dokumente.'
你也可以使用 unicode-escape
和 raw-unicode-escape
来实现这个 (link) :
string = 'Bitte überprüfen Sie, ob die Dokumente erfolgreich in System ' \
'eingereicht wurden, und löschen Sie dann die tatsächlichen Dokumente.'
print(string.encode('unicode-escape').decode('raw-unicode-escape'))
输出:
Bitte \xfcberpr\xfcfen Sie, ob die Dokumente erfolgreich in System eingereicht wurden, und l\xf6schen Sie dann die tats\xe4chlichen Dokumente.
注意 : ascii()
将使用 \x
, \u
, \U
转义非 ascii 字符 1 个字节,分别为2字节和4字节。在您的情况下,您会看到 \x
。但是试试这个:
print(ascii('س')) # '\u0633'
如果您真的想将 \xhh
转义序列转换为 \u00hh
,请在 ascii()
:
的结果上使用 re.sub()
import re
print(re.sub(r'\x[a-f0-9]{2}', lambda x: r'\u00' + x.group()[-2:].upper(), ascii(string)))
输出:
'Bitte \u00FCberpr\u00FCfen Sie, ob die Dokumente erfolgreich in System eingereicht wurden, und l\u00F6schen Sie dann die tats\u00E4chlichen Dokumente.'
以上方法适用于转义任何非 ascii 字符,如果您只想转义这三个德国字母表并且没有其他非 ascii 字符,请查看 str.translate()
方法。
另一种解决方案,不依赖于内置 repr()
而是从头开始实施:
orig = 'Bitte überprüfen Sie, ob die Dokumente erfolgreich in System eingereicht wurden, und löschen Sie dann die tatsächlichen Dokumente.'
enc = re.sub('[^ -~]', lambda m: '\u%04X' % ord(m[0]), orig)
print(enc)
差异:
- 仅使用
\u
编码,从不使用任何其他序列,而 repr()
使用大约三分之一的字母表(因此例如 BEL 字符将被编码为 \u0007
而不是\a
)
- 指定的大写编码(
\u00FC
而不是 \u00fc
)
- 不处理平面 0 之外的 unicode 字符(可以很容易地扩展,给定这些应该如何表示的规范)
- 它不处理任何预先存在的
\u
序列,而 repr()
将它们转换为 \u
;可以扩展,也许将 \
编码为 \u005C
:
enc = re.sub(r'[^ -[\]-~]', lambda m: '\u%04X' % ord(m[0]), orig)
我的目标是:
字符串如:
Bitte überprüfen Sie, ob die Dokumente erfolgreich in System eingereicht wurden, und löschen Sie dann die tatsächlichen Dokumente.
转换为:
'Bitte \u00FCberpr\u00FCfen Sie, ob die Dokumente erfolgreich in System eingereicht wurden, und l\u00F6schen Sie dann die tats\u00E4chlichen Dokumente.'
并以这种形式写入文件(UTF-8编码)。
一个简单的解决方案是 ascii():
string = 'Bitte überprüfen Sie, ob die Dokumente erfolgreich in System ' \
'eingereicht wurden, und löschen Sie dann die tatsächlichen Dokumente.'
print(ascii(string))
输出:
'Bitte \xfcberpr\xfcfen Sie, ob die Dokumente erfolgreich in System eingereicht wurden, und l\xf6schen Sie dann die tats\xe4chlichen Dokumente.'
你也可以使用 unicode-escape
和 raw-unicode-escape
来实现这个 (link) :
string = 'Bitte überprüfen Sie, ob die Dokumente erfolgreich in System ' \
'eingereicht wurden, und löschen Sie dann die tatsächlichen Dokumente.'
print(string.encode('unicode-escape').decode('raw-unicode-escape'))
输出:
Bitte \xfcberpr\xfcfen Sie, ob die Dokumente erfolgreich in System eingereicht wurden, und l\xf6schen Sie dann die tats\xe4chlichen Dokumente.
注意 : ascii()
将使用 \x
, \u
, \U
转义非 ascii 字符 1 个字节,分别为2字节和4字节。在您的情况下,您会看到 \x
。但是试试这个:
print(ascii('س')) # '\u0633'
如果您真的想将 \xhh
转义序列转换为 \u00hh
,请在 ascii()
:
re.sub()
import re
print(re.sub(r'\x[a-f0-9]{2}', lambda x: r'\u00' + x.group()[-2:].upper(), ascii(string)))
输出:
'Bitte \u00FCberpr\u00FCfen Sie, ob die Dokumente erfolgreich in System eingereicht wurden, und l\u00F6schen Sie dann die tats\u00E4chlichen Dokumente.'
以上方法适用于转义任何非 ascii 字符,如果您只想转义这三个德国字母表并且没有其他非 ascii 字符,请查看 str.translate()
方法。
另一种解决方案,不依赖于内置 repr()
而是从头开始实施:
orig = 'Bitte überprüfen Sie, ob die Dokumente erfolgreich in System eingereicht wurden, und löschen Sie dann die tatsächlichen Dokumente.'
enc = re.sub('[^ -~]', lambda m: '\u%04X' % ord(m[0]), orig)
print(enc)
差异:
- 仅使用
\u
编码,从不使用任何其他序列,而repr()
使用大约三分之一的字母表(因此例如 BEL 字符将被编码为\u0007
而不是\a
) - 指定的大写编码(
\u00FC
而不是\u00fc
) - 不处理平面 0 之外的 unicode 字符(可以很容易地扩展,给定这些应该如何表示的规范)
- 它不处理任何预先存在的
\u
序列,而repr()
将它们转换为\u
;可以扩展,也许将\
编码为\u005C
:enc = re.sub(r'[^ -[\]-~]', lambda m: '\u%04X' % ord(m[0]), orig)