问题在于您混合了 8 位字符串和完整的 Unicode 字符串。 @cdosborn 很好地描述了这如何导致部分替换字符。
在 Python > 2.x 中,有两种保存文本的方法:字符串和 Unicode 字符串。字符串可以包含纯 ASCII、ANSI、Windows-1252、UTF-8、UTF-16 格式的编码文本。问题是如果您需要转换文本,您必须知道文本的编码。手头上的 Unicode 字符串是完全明确的,因为它们是使用已知编码、使用 Unicode 转义码 (u"\u00A3") 或类似 unichr() 的函数从字符串显式转换的结果。
最佳做法是始终在输入代码时将字符串解码为 Unicode。然后在出去的时候编码。这是 Python 3.x 和其他语言(如 Java)的默认行为。
如果您正在处理文件,codecs 模块提供了一种在输入过程中将文本转换为 Unicode 字符串的好方法:
my_file = codecs.open("filename.txt", "r", "utf-8")
my_unicode_string = my_file.read()
显然,如果您的文件采用其他编码,请将编码名称更改为 utf-8 - 请参阅编解码器名称:https://docs.python.org/2/library/codecs.html#standard-encodings
如果您正在处理来自其他地方的字符串(stdin、webforms),请使用以下方法进行转换:
my_unicode_string = "my €uro sign in utf-8".decode("utf-8")
同样,相应地更改 utf-8 参数
一旦你有了一个 Unicode 字符串,你就可以随意使用它了。要对井号进行简单的搜索和替换,请执行以下操作:
my_unicode_string.replace(unichr(163), "")
为了使您的代码更易于阅读,您可以将源代码编码为 UTF-8 并声明编码。这意味着您不必在转义序列或序数中隐藏 Unicode 字符。
总而言之:
# -*- coding: utf-8 -*-
my_file = codecs.open("filename.txt", "r", "utf-8")
my_unicode_string = my_file.read()
replaced_unicode_string = my_unicode_string.replace("£", "")
现在,如果您想将 replaced_unicode_string 写入另一个文件:
my_output_file = codecs.open("another_filename.txt", "w", "utf-8")
my_output_file.write(replaced_unicode_string)