你要在 C 和 Python 直接来回转换字符串,但是 C 中的编码格式并不确定。 例如,可能 C 中的数据期望是 UTF-8,但是并没有强制它必须是。 你想编写代码来以一种优雅的方式处理这些不合格数据,这样就不会让 Python 奔溃或者破坏进程中的字符串数据。
解决方案
下面是一些 C 的数据和一个函数来演示这个问题:
/* Some dubious string data (malformed UTF-8) */constchar*sdata ="Spicy Jalape\xc3\xb1o\xae";int slen =16;/* Output character data */voidprint_chars(char*s,intlen){int n =0;while(n < len){printf("%2x",(unsignedchar)s[n]); n++;}printf("\n");}
>>> s = raw.decode('utf-8', 'surrogateescape')
>>> print(s)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'utf-8' codec can't encode character '\udcae'
in position 14: surrogates not allowed
>>> s
'Spicy Jalapeño\udcae'
>>> s.encode('utf-8','surrogateescape')
b'Spicy Jalape\xc3\xb1o\xae'