我在另一个主题上找到了类似问题的解决方案,但不幸的是它对我不起作用。这是我的问题:
我正在从我想在另一个文件中搜索的代理对 unicode 制作数据帧(例如:“\uD83C\uDFF3”、“\u26F9”、“\uD83C\uDDE6\uD83C\uDDE8”):
with open("unicodes.csv", "rt") as csvfile:
emoticons = pd.read_csv(csvfile, names=["xy"])
emoticons = pd.DataFrame(emoticons)
emoticons = emoticons.astype(str)
接下来,我正在阅读带有文本的文件,其中一些行包含代理对 unicode:
for chunk in pd.read_csv(path, names=["xy"], encoding="utf-8", chunksize=chunksize):
spam = pd.DataFrame(chunk)
spam = spam.astype(str)
在这个 for 循环中,我正在检查 line 是否包含 surrogatepairs unicode,如果它是真的,那么我想将这个 surrogatepair unicode 打印为表情符号 - 这就是我编码和解码这个“i”值的原因,它是 str:(解决方案来自:如何在 Python 中使用代理对?)
for i in emoticons.xy:
if spam["xy"].str.contains(i, regex=False).any():
print(i.encode('utf-16', 'surrogatepass').decode('utf-16'))
#printing:
#\uD83C\uDFF3
#\u26F9
#\uD83C\uDDE6\uD83C\uDDE8
因此,当我启动程序时,它仍然将 surrogatepairs unicode 打印为 str,而不是 emoji,但是当我自己将 surrogatepair unicode 输入打印函数时,它可以工作:
print("\uD83C\uDFF3".encode("utf-16", "surrogatepass").decode("utf-16", "surrogatepass"))
#printing:
#
我究竟做错了什么?我试图从这个 i 和另一个解决方案中制作字符串,但它仍然不起作用。
编辑:
hexdump -C file.csv
00004b70 5c 75 44 38 33 44 5c 75 44 45 45 39 0a 5c 75 44 |\uD83D\uDEE9.\uD|
00004b80 38 33 44 5c 75 44 45 45 42 0a 5c 75 44 38 33 44 |83D\uDEEB.\uD83D|
00004b90 5c 75 44 45 45 43 0a 5c 75 44 38 33 44 5c 75 44 |\uDEEC.\uD83D\uD|
00004ba0 43 42 41 0a 5c 75 44 38 33 44 5c 75 44 45 38 31 |CBA.\uD83D\uDE81|
EDIT2:所以我发现了一些可行的方法,但仍需要改进: https ://stackoverflow.com/a/54918256/4789281
我要转换的另一个文件中的文本看起来文件:
"O żółtku zapomniałaś \uD83D\uDE02"
"Piękny outfit \uD83D\uDE0D"
当我这样做时,另一个主题中的建议是:
print(codecs.decode(i,encoding='unicode_escape',errors='surrogateescape').encode('utf-16', 'surrogatepass').decode('utf-16'))
我有这样的事情:
O żóÅtku zapomniaÅaÅ
PiÄkny outfit
所以我的代理对被替换了,但是我的波兰字符被一些奇怪的东西替换了。