2012-03-26 27 views
2
  • 我有1个源文件与
  • 我有1不与相同的字符编码文件UTF-8字符(名称)。
  • 我正在处理一个html页面,粘贴并剪切了有用的 信息让我出来文件。
  • 我用“éáűúőóüöäđĐ”字在我的 “friendsNames” txt文件

而我给了这个错误:??的Python - 字符编码和解码的问题

Traceback (most recent call last): 
    File "C:\Users\Rendszergazda\workspace\achievements\hiba.py", line 9, in <module> 
    s = str(urlopen("http://eu.battle.net/wow/en/character/arathor/"+str(names[0])+"/achievement").read(), encoding='utf-8') 
    File "C:\Python27\lib\encodings\cp1250.py", line 12, in encode 
    return codecs.charmap_encode(input,errors,encoding_table) 
UnicodeEncodeError: 'charmap' codec can't encode character u'\ufeff' in position 0: character maps to <undefined> 

你觉得什么是我的问题

from urllib import urlopen 
import codecs 

result = codecs.open("C:\Users\Desktop\Achievements\Result.txt", "a", "utf-8") 
fh = codecs.open("C:\Users\Desktop\Achievements\FriendsNames.txt", "r", "utf-8") 
line = fh.readline() 
names = line.split(" ") 
fh.close() 

s = urlopen("http://eu.battle.net/wow/en/character/arathor/"+str(names[0])+"/achievement").read(), encoding='utf8') 
result.write(str(s)) 
result.close() 
+1

仅供参考:字符“0xfeff”是[BOM](http://en.wikipedia.org/wiki/Byte_order_mark)。此外,您的错误消息和您的代码示例不匹配。 – hochl 2012-03-26 11:45:18

+1

如果你想了解更多关于unicode的信息,我强烈建议http://bit.ly/unipain – 2012-03-26 11:46:35

回答

2

你遇到的问题是你打电话给str(array[0]),其中array[0]是一个unicode字符串,这意味着它将被编码为默认编码,由于某种原因,你的情况似乎是cp1250。 (你有没有搞砸sys.setdefaultencoding()?不这样做。)

要获取unicode的字节串,你应该明确地编码 unicode。不要只拨打str()就可以了。使用结果应该具有的编码对其进行编码(对于URL,这在某种程度上难以猜到,但在这种情况下可能是UTF-8)。因此,使用`array [0] .encode('utf-8' )”。您可能还需要引用URL中的非ASCII字符,尽管这取决于远程端的期望。

+0

但我给了一个新的问题,在utf-8 xy.write“吃”我的“\ n”,我试过这个: **ü“\ u000A”**(utf-8新行),但它不起作用:( – user1292883 2012-03-26 12:09:33

+0

恐怕我不明白这个问题。u“\ u00A”与u“\”是一样的。 n“,它是unicode,而不是UTF-8(请参阅http://bit.ly/unipain。)我建议你发表一个新问题来描述你当前的问题 – 2012-03-26 12:18:05

+1

你可能在Windows上并试图打开你的输出与记事本,或记事本只能理解\ r \ n,但Word和写字板将显示您的文件就好。 – alexis 2012-03-26 15:43:54