【问题标题】:Python Unicode Handling Errors - How To Simply Remove UnicodePython Unicode 处理错误 - 如何简单地删除 Unicode
【发布时间】:2013-05-13 07:18:24
【问题描述】:

这个网站上有几十个,甚至上百个关于 python 处理 unicode 错误的问题。这是我所说的一个例子:

UnicodeDecodeError:“ascii”编解码器无法解码位置 2310 中的字节 0xe2:序数不在范围内 (128)

很多问题表明 OP 只是想让违规内容消失。他们收到的回复都充斥着关于编解码器、字符集以及各种没有解决这个基本问题的东西:

“我正在尝试处理一个包含一些 unicode 的文本文件,我根本不在乎这些东西是什么,这只是我要解决的问题的上下文中的噪音。”

所以,我有一个包含无数 JSON 编码推文的文件,我对这些特殊字符完全不感兴趣,我希望将它们从行中删除。

fh = open('file-full-of-unicode.txt')
for line in fh:
   print zap_unicode(line)

给定一个名为“line”的变量,我如何简单地打印它减去它可能包含的任何 unicode?​​p>

在那里,我以几种不同的方式重复了这个问题,所以它不会被误解 - unicode 在我正在尝试做的事情的上下文中是垃圾,我想将它转换为无害的东西或完全删除它。这如何最容易完成?

【问题讨论】:

  • 删除所有 Unicode,保留非 Unicode?好吧,改成空字符串就好了。
  • 学习这篇文章怎么样:joelonsoftware.com/articles/Unicode.html ?你所说的“几十个 os unicode 问题”中至少有四分之一也应该指出这一点,也许,只是也许,它实际上可以教给你一些东西,这样你就可以尝试继续编码?
  • 如果内容毫无意义以至于可以从中删除字符,为什么还要打印这些行?

标签: python unicode


【解决方案1】:

你可以line.decode('ascii', 'ignore')。这会将所有可以解码的内容都解码为 ASCII,忽略任何错误。

但是,如果您这样做,请为痛苦做好准备。 Unicode 的存在是有原因的。在不知道要丢弃什么的情况下丢弃部分数据几乎总是会导致问题。这就像在说“我不在乎我的汽车引擎中的某些小玩意儿是否不起作用,我只想驾驶它。只要取出任何不起作用的东西!”在它爆炸之前,一切都很好。

【讨论】:

  • BrenBam - 我想计算推文中英语单词的情绪。将 unicode 以及任何#hashtag 或@username 放在一边正是我想要完成的。
  • @NealRauhauser:你认为 cafe 和 naïve 是英文单词吗?
  • @NealRauhauser:通过逐个字符地折腾 unicode,您将从一些非英语单词中创建虚假的英语单词(或无效的英语单词)。如果有人写“élan”,你会读为“lan”。如果有人写“cœur”,你会读作“cur”。
  • +1 用于准确回答 O.P. 问题 - 即使这是他不应该做的问题。
【解决方案2】:

问题不能“消失”,无法正确处理unicodes 的代码必须修复。没有简单的方法可以做到这一点,但最简单的方法是对输入的字节进行解码,以确保应用程序在任何地方都使用文本。

【讨论】:

  • @JeffTratner:这并没有“解决”它,只是,好吧......忽略它。
  • 这是我试图做的解决方案 - re.sub('\u','',line) 钉住了 unicode 字符的每个实例。
  • print str(line.decode('ascii','ignore')) 这似乎是正确的。我与其他一些 decode() 事情搏斗,我想今晚我的手指很胖,视力模糊。
  • @NealRauhauser:在尝试“摆脱”它之前,先了解一下 unicode 是什么
  • @Neal:如果您的输入不是严格的 ASCII 超集编码,.decode('ascii') 不仅会丢弃非 ASCII 字符,而且还可能插入任意字符。例如 UTF-16 和东亚编码。对于可能引入注入安全漏洞的 JSON 和 XML 等结构化格式。故意忽略 Unicode 是一项非常糟糕的政策。
【解决方案3】:

正如@BrenBarn 建议的那样,结果将是虚假的英文单词......

我的建议是为什么不考虑删除包含 unicode 字符的整个单词 即一个词是space+characters+space 如果characters 有一个unicode 字符然后删除前一个空格之后和下一个空格之前的所有字符.. 结果会比只删除unicode 字符好得多..

如果您只想删除名称 (@username) 和标签 (#tags),您可以使用过滤器 ([@,#,..]) 而不是强制搜索所有 unicode 字符。..

我的声誉很低,所以无法发表评论,所以将其作为答案.. :-(

【讨论】:

    猜你喜欢
    • 2011-07-11
    • 1970-01-01
    • 2015-12-03
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多