使用 Python 或 Perl 修复无效的 XML:UTF-16 替代以 UTF-8 编码的表情符号
fixing invalid XML with Python or Perl: UTF-16 surrogates for emoji encoded in UTF-8
我正在尝试使用我能收集到的所有旧备份对我的短信进行数值分析。理想情况下,表情符号将包含在分析中。我正在混合使用 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 的所有细节,但据我所知,我的短信包括 high/low 代理项的 UTF-8 中的 HTML 转义字符。它们单独是无效字符,但它们一起编码。 (XML header 确实指定了 UTF-8。)
很多这些文本已经从我的 phone 中删除(其中一些备份已经快一年了)所以我不能简单地再次提取它们并看看我是否可以像这样修复格式.
我的问题:在我开始深入研究 Unicode 和 HTML 转义字符的细节并花时间自己写一些东西来解决这个问题之前(我从 知道有一个公式用于转换代理项,并且 Python 中的字符串有 encode/decode 方法,以及帮助处理 HTML 实体的各种点点滴滴),是否存在 [=27] =] Python 或 Perl 中的函数可以帮助我修复文件的编码,或者至少让我参与其中? (甚至是我缺少的 Unix/Linux 命令行工具。)
使用 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 ��" 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'>
我正在尝试使用我能收集到的所有旧备份对我的短信进行数值分析。理想情况下,表情符号将包含在分析中。我正在混合使用 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 的所有细节,但据我所知,我的短信包括 high/low 代理项的 UTF-8 中的 HTML 转义字符。它们单独是无效字符,但它们一起编码。 (XML header 确实指定了 UTF-8。)
很多这些文本已经从我的 phone 中删除(其中一些备份已经快一年了)所以我不能简单地再次提取它们并看看我是否可以像这样修复格式.
我的问题:在我开始深入研究 Unicode 和 HTML 转义字符的细节并花时间自己写一些东西来解决这个问题之前(我从
使用 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 ��" 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'>