将UTF-8转换为ASCII的Python脚本

45

我正在尝试编写一个Python脚本,将UTF-8文件转换为ASCII文件:

#!/usr/bin/env python
# *-* coding: iso-8859-1 *-*

import sys
import os

filePath = "test.lrc"
fichier = open(filePath, "rb")
contentOfFile = fichier.read()
fichier.close()

fichierTemp = open("tempASCII", "w")
fichierTemp.write(contentOfFile.encode("ASCII", 'ignore'))
fichierTemp.close()
当我运行这个脚本时,出现如下错误: UnicodeDecodeError: 'ascii'编码无法解码位置13中的字节0xef:序数不在128的范围内
我以为可以通过encode方法中的ignore参数忽略错误。但似乎不行。 我愿意尝试其他转换方式。

2
问题在于你从一开始就没有解码。 - Ignacio Vazquez-Abrams
你之所以出现错误是因为该字符在ASCII字符集中不存在,因此无法转换。有时您可以将UTF8字符映射到ASCII中最接近的视觉匹配字符,例如 é 转换成 e,但这可能会改变单词的含义。您必须决定该方法是否适用于您的应用程序。 - the Tin Man
这似乎是一个非常糟糕的想法!! - tchrist
3个回答

70
data="UTF-8 DATA"
udata=data.decode("utf-8")
asciidata=udata.encode("ascii","ignore")

18
听起来像是一种导致数据丢失的糟糕配方。 - tchrist
53
如果你希望从8位编码转换成7位编码,那么就应该预计到可能会有数据丢失。 - Utku Zihnioglu
3
我之前忽略了必须先解码的步骤,现在它可以正常工作了,谢谢。为了回答这个问题,我之所以想这样做是因为我的MP3播放器只能显示用ASCII编码的歌词文件。 - Nicolas
您可以查看这个解决方案:https://dev59.com/8HRB5IYBdhLWcg3wxZ7Y#517974 - JSBach
我在使用Python 3.10.4的第二行代码中遇到了AttributeError: 'str' object has no attribute 'decode'错误。你是不是想说encode - peer
我在使用Python 3.10.4的第二行代码中遇到了AttributeError: 'str' object has no attribute 'decode'的错误。你是不是想说的是encode - undefined

9
import codecs

 ...

fichier = codecs.open(filePath, "r", encoding="utf-8")

 ...

fichierTemp = codecs.open("tempASCII", "w", encoding="ascii", errors="ignore")
fichierTemp.write(contentOfFile)

 ...

6

UTF-8是ASCII的超集。如果你的UTF-8文件是ASCII,那么它可以无损转换,否则就不能。


15
我认为他意识到了这一点,否则他不会试图使用“忽略”选项。 - Ignacio Vazquez-Abrams
1
@Ignacio 确实。但这个问题让我想知道提问者试图达到什么目的。他们可能在模仿,或者也许他们的需求最好通过像urlencode这样的东西来满足,或者有损失是可以接受的。 - Tobu
我害怕货物崇拜现象。剔除所有你不欣赏的字符真的很不敏感。 - tchrist
@Ignacio:想象一下被称为Vzquez-Abrams。:( - tchrist
@tchrist: 这就是为什么我从不使用它。 - Ignacio Vazquez-Abrams
有时候你可以将UTF8转换为ASCII而不会有损失,例如单引号或撇号,在其他一些情况下 - 算术运算 - UTF8长编码和ASCII单个符号都可用。 - Kovalex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接