繁体   English   中英

Python 3.4 - 在写入文件时删除或忽略表情符号字符

[英]Python 3.4 - Remove or ignore emoji characters when writing to file

我正在尝试解析XML文件并将内容写入纯文本文件。 我有程序工作到目前为止,直到它击中一个表情符号字符,然后Python抛出以下错误:

UnicodeEncodeError: 'charmap' codec can't encode characters in position 177-181: character maps to <undefined>

我转到错误位置,在XML文件中找到以下表情符号:

表情符号

我的问题是如何将它们编码为unicode或在写入文件时完全删除/忽略它们。

当我将()打印到控制台时,它输出完美,但在写入文件时会抛出错误。

我在谷歌和这里搜索过,但我得到的唯一答案是它们已经被编码为unicode。 你可以看到我的文字是什么? 我不确定我是否正确说出来。

我正在使用的XML文件具有以下格式:

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<?xml-stylesheet type="text/xsl" href="sms.xsl"?>
<smses count="1">
  <sms protocol="0" address="+00000000000" date="1346772606199" type="1" subject="null" body="Lorem ipsum dolor sit amet, consectetur adipisicing elit," toa="null" sc_toa="null" service_center="+00000000000" read="1" status="-1" locked="0" date_sent="1346772343000" readable_date="Sep 4, 2012 10:30:06 AM" contact_name="John Doe" />
</smses>

您有两种选择:

  1. 选择一个可以处理表情符号代码点的编码。 您已使用默认编解码器(取决于您的系统)打开文件以进行编写,或者选择了不支持代码点的显式编码。

    UTF编码可以很好地处理代码点; 我在这里选择UTF-8:

     with open(filename, 'w', encoding='utf8') as outfile: outfile.write(yourdata) 
  2. 设置一个错误处理模式,它可以替换您的编解码器无法处理的代码点与替换字符,转义序列或完全忽略它们。 请参阅open()函数 errors参数:

    errors是一个可选字符串,用于指定如何处理编码和解码错误 - 这不能在二进制模式下使用。 虽然已经使用codecs.register_error()注册的任何错误处理名称也有效,但可以使用各种标准错误处理程序。 标准名称是:

    • 如果存在编码错误,则'strict'引发ValueError异常。 默认值None具有相同的效果。
    • 'ignore'忽略错误。 请注意,忽略编码错误可能会导致数据丢失。
    • 'replace'导致在有错误数据的地方插入替换标记(例如'?' )。
    • 'surrogateescape'将表示任何不正确的字节,作为Unicode专用区中的代码点,范围从U + DC80到U + DCFF。 当在写入数据时使用surrogateescape错误处理程序时,这些私有代码点将被转回到相同的字节中。 这对于处理未知编码的文件很有用。
    • 只有在写入文件时才支持'xmlcharrefreplace' 编码不支持的字符将替换为相应的XML字符引用&#nnn;
    • 'backslashreplace' (也只在编写时支持)用Python的反斜杠转义序列替换不支持的字符。

    因此,使用errors='ignore'打开文件将不会编写表情符号代码点而不是引发错误:

     with open(filename, 'w', errors='ignore') as outfile: outfile.write(yourdata) 

演示:

>>> a_ok = 'The U+1F44C OK HAND SIGN codepoint: \U0001F44C'
>>> print(a_ok)
The U+1F44C OK HAND SIGN codepoint: 👌
>>> a_ok.encode('utf8')
b'The U+1F44C OK HAND SIGN codepoint: \xf0\x9f\x91\x8c'
>>> a_ok.encode('cp1251', errors='ignore')
b'The U+1F44C OK HAND SIGN codepoint: '
>>> a_ok.encode('cp1251', errors='replace')
b'The U+1F44C OK HAND SIGN codepoint: ?'
>>> a_ok.encode('cp1251', errors='xmlcharrefreplace')
b'The U+1F44C OK HAND SIGN codepoint: &#128076;'
>>> a_ok.encode('cp1251', errors='backslashreplace')
b'The U+1F44C OK HAND SIGN codepoint: \\U0001f44c'

请注意, 'surrogateescape'选项的空间有限,实际上只能用于解码具有未知编码的文件; 在任何情况下它都无法处理表情符号。

(编辑:这个答案与Python 2.x有关,而不是Python 3.x)

目前,您正在使用默认编码将unicode字符串写入文件,该编码不支持表情符号(或者,就此而言,您可能确实需要大量字符)。 您可以使用支持所有unicode字符的UTF-8编码进行编写。

而不是执行file.write( data ) ,请尝试file.write( data.encode("utf-8") )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM