使用Python或Perl修复无效的XML:UTF-16代表以UTF-8编码的表情符号

时间:2016-07-02 03:05:15

标签: xml unicode utf-8 emoji

我正在尝试使用我可以收集的所有旧备份对我的短信进行数值分析。理想情况下,表情符号将包含在分析中。我正在使用Python和Perl的混合将所有内容集中到一个地方,并且一旦完成就可能使用R.

但是,我遇到了表情符号编码问题。我的一些备份是使用Android上的SMS备份和恢复应用程序创建的,用于将我的文本作为XML文件提取。我开始在t413将我的XML投入this Python SMS module available on github。当模块在解析器中抛出错误时,我将消息通过验证器查看是什么,并且由于无效字符,XML无效。例如,我收到的部分文本与Perl上的XML :: Validate模块不兼容:

So if we get it out hang out will be short ��...

我不知道Unicode的所有细节,但据我所知,我的短信包括UTF-8中的HTML转义字符,用于高/低代理。单独地,它们是无效字符,但它们一起编码。 (XML标头确实指定了UTF-8。)

很多这些文本已经从我的手机中删除了(其中一些备份已经差不多一年了)所以我不能简单地再次拉它们,看看我是否可以修复这样的格式。

我的问题:在我开始深入研究Unicode和HTML转义字符的细节并花时间写一些东西来解决这个问题之前(我从this question知道有一个公式用于转换代理人,并且Python中有字符串的编码/解码方法,以及帮助HTML实体的各种各样的部分),Python或Perl中是否有任何现有的模块/内置函数可以帮助我修复文件的编码,或者至少让我参与那里的一部分? (甚至是我缺少的Unix / Linux命令行工具。)

1 个答案:

答案 0 :(得分:0)

使用Python的Beautiful Soup模块。这将取消对XML实体的影响,包括UTF-16代理。

假设XML的格式,您可以执行以下操作以将消息正文检索为Unicode字符串:

from bs4 import BeautifulSoup

my_xml = """<sms protocol="0" address="09001234567" date="1365481757533" type="2" subject="null"
body="So if we get it out hang out will be short &#55357;&#56852;" toa="null" sc_toa="null" service_center="null"
read="1" status="32" locked="0" date_sent="0" readable_date="2013/04/09 12:29:17"
contact_name="Cute Chic" />"""

soup = BeautifulSoup(my_xml, 'html.parser')

message = soup.sms['body']

print message
print type(message)

结果:

So if we get it out hang out will be short 
<type 'unicode'>