Python 字符串比较——特殊/Unicode 字符问题

标签 python string

我正在编写一个 Python 脚本来处理一些音乐数据。它应该通过比较它们的条目并匹配它们来合并两个单独的数据库。它几乎可以工作,但在比较包含特殊字符(即重音字母)的字符串时会失败。我很确定这是 ASCII 与 Unicode 编码问题,因为我收到错误:

“Unicode 相等比较未能将两个参数转换为 Unicode - 将它们解释为不相等”

我知道我可以使用正则表达式来删除有问题的字符,但我正在处理大量数据并且过度依赖正则表达式会使我的程序非常慢。有没有办法让 Python 正确比较这些字符串?这是怎么回事——有没有办法判断它是将我的字符串存储为 ASCII 还是 Unicode?

编辑 1:我使用的是 Python v2.6.6。检查类型后,我发现一个数据库向我吐出 Unicode 字符串,一个数据库给出 ASCII。所以这可能就是问题所在。我正在尝试将 ASCII 字符串从第二个数据库转换为 Unicode,使用如下行

line = unicode(f.readline().decode(latin_1).encode(utf_8))

但这会产生如下错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 41: ordinal not in range(128)

我不确定为什么“ascii”编解码器会报错,因为我正在尝试从 ASCII 解码。谁能帮忙?

最佳答案

Unicode 与字节

首先,一些术语。有两种类型的字符串,编码和解码:

  • 已编码。这是存储在磁盘上的内容。对于 Python 来说,它是一堆 0 和 1,您可以将其视为 ASCII,但它可以是任何东西——二进制数据、JPEG 图像,等等。在 Python 2.x 中,这称为“字符串”变量。在 Python 3.x 中,它更准确地称为“字节”变量。
  • 已解码。这是一串实际字符。它们可以编码为 8 位 ASCII 字符串,也可以编码为 32 位汉字。但在转换为编码变量之前,它只是一个 Unicode 字符串。

这对您意味着什么

事情是这样的。你说你得到一个 ASCII 变量和一个 Unicode 变量。这实际上不是真的。

  • 您有一个变量,它是一串字节 -- 1 和 0,大概是 8 个一组。这是您错误地假设为 ASCII 的变量。
  • 您有另一个变量,它是 Unicode 数据——数字、字母和符号。

在将字节串与 Unicode 字符串进行比较之前,您必须做出一些假设。在您的情况下,Python(和您)假定字节串是 ASCII 编码的。在您遇到一个不是 ASCII 的字符之前,它工作得很好——一个带有重音符号的字符。

所以你需要找出那个字节串被编码成什么。它可能是 latin1。如果是,你想这样做:

if unicode_variable == string_variable.decode('latin1')

Latin1 基本上是 ASCII 加上一些扩展字符,如 Ç 和 Â。

如果您的数据是 Latin1,这就是您需要做的全部。但是,如果您的字节串以其他方式编码,则您需要弄清楚那是什么编码并将其传递给 decode()。

底线是,没有简单的答案,除非您知道(或做出一些假设)输入数据的编码

我会做什么

尝试在您的字节串上运行 var.decode('latin1')。这将为您提供一个 Unicode 变量。如果这有效,并且数据看起来正确(即,带有重音符号的字符看起来属于他们),那就继续吧。

哦,如果 latin1 无法解析或看起来不正确,请尝试 utf8——另一种常见编码。

关于Python 字符串比较——特殊/Unicode 字符问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5228925/

相关文章:

c# - 快速自定义字符串拆分

python - 如何根据索引提取子字符串

java - PatternSyntaxException : Unclosed Group near Index 1. 为什么我的检查不起作用?

java - 用不可见字符(制表符、回车符、组分隔符等)分隔字符串?

c - 在 C 中将文本右对齐

python - 拆分 pandas 数据框的所有列表列

python - 在 Python 中使用 Pool 时将 kwargs 传递给 starmap

python - python 中的 zip 和过滤器

python - 来自 numpy 数组的 SFrame

python - 在来自 opencv 视频捕获的视频中使用 tensorflow 检测对象