从文本文件编码表情符号(Python)的最佳,简洁方法

时间:2018-09-05 07:29:39

标签: python unicode text-files encode emoji

已回答以下问题:Emoji crashed when uploading to Big Query

我正在寻找一种最佳且干净的方法来将表情符号从这种\ud83d\ude04类型编码为这种(Unicode)-\U0001f604,因为目前,除了创建python方法之外,我没有任何其他想法将通过一个文本文件并替换表情符号编码。

这是可以转换的字符串:

Converting emojis to Unicode and vice versa in python 3

作为一个假设,可能需要逐行通过文本并将其转换?

潜在想法:

with open(ff_name, 'rb') as source_file:
  with open(target_file_name, 'w+b') as dest_file:
    contents = source_file.read()
    dest_file.write(contents.decode('utf-16').encode('utf-8'))

2 个答案:

答案 0 :(得分:1)

因此,我假设您以某种方式获得了一个原始ASCII字符串,其中包含带有形成代理对的UTF-16代码单元的转义序列,并且您(无论出于何种原因)都希望将其转换为{{1} }-格式。

因此,从现在开始,我假设您的输入(字节!)如下所示:

\UXXXXXXXX

现在您要执行以下操作:

  1. weirdInput = "hello \\ud83d\\ude04".encode("latin_1") 事物转换为UTF-16代码单元的方式解释字节。有\uXXXX,但不幸的是,它需要单独通过才能解决代理对(老实说,我不知道为什么)
  2. 修复代理对,将数据转换为有效的UTF-16
  3. 解码为有效的UTF-16
  4. 再次将其编码为“ raw_unicode_escape”
  5. 解码回旧的raw_unicode_escapes,仅由旧的ASCII格式为latin_1的unicode转义序列组成。

类似这样的东西:

\UXXXXXXXX

现在,如果您 output = (weirdInput .decode("raw_unicode_escape") .encode('utf-16', 'surrogatepass') .decode('utf-16') .encode("raw_unicode_escape") .decode("latin_1") ) ,您将得到:

print(output)

请注意,如果您停在中间阶段:

hello \U0001f604

然后您会得到带有笑脸的unicode字符串:

smiley = (weirdInput
  .decode("raw_unicode_escape")
  .encode('utf-16', 'surrogatepass')
  .decode('utf-16')
)

完整代码:

print(smiley)
# hello 

答案 1 :(得分:0)

\ud83d\ude04是字符SMILING FACE WITH OPEN MOUTH AND SMILING EYES (U+1F604)的utf16表示形式,您需要将其解码为字符,然后将字符的代码点转换为十六进制字符串。我对Python的了解不足,无法告诉您如何执行此操作。