蟒编码UTF-8(python encoding utf-8)

2019-07-20 13:47发布

我在Python做一些脚本。 我创建一个字符串,我保存在一个文件中。 这串了大量的数据,从目录树状结构和文件名来。 据convmv,我所有的树状结构是UTF-8。

我希望把一切都在UTF-8,因为我将在MySQL后保存。 现在,在MySQL,这是UTF-8,我得到了一些问题,一些字符(如e或E - 我'法语)。

我想那蟒蛇总是使用字符串作为UTF-8。 我看了网上的一些信息,我也这样。

我的脚本具有此开始:

 #!/usr/bin/python
 # -*- coding: utf-8 -*-
 def createIndex():
     import codecs
     toUtf8=codecs.getencoder('UTF8')
     #lot of operations & building indexSTR the string who matter
     findex=open('config/index/music_vibration_'+date+'.index','a')
     findex.write(codecs.BOM_UTF8)
     findex.write(toUtf8(indexSTR)) #this bugs!

当我执行,这里就是答案: UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 2171: ordinal not in range(128)

编辑:我明白了,在我的文件,口音都写得很好。 创建该文件后,我读了它,我把它写到MySQL。 但我不明白为什么,但我得到了编码问题。 我的MySQL数据库是UTF8,或似乎是SQL查询SHOW variables LIKE 'char%'返回我只有UTF8或二进制。

我的函数如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-

def saveIndex(index,date):
    import MySQLdb as mdb
    import codecs

    sql = mdb.connect('localhost','admin','*******','music_vibration')
    sql.charset="utf8"
    findex=open('config/index/'+index,'r')
    lines=findex.readlines()
    for line in lines:
        if line.find('#artiste') != -1:
            artiste=line.split('[:::]')
            artiste=artiste[1].replace('\n','')

            c=sql.cursor()
            c.execute('SELECT COUNT(id) AS nbr FROM artistes WHERE nom="'+artiste+'"')
            nbr=c.fetchone()
            if nbr[0]==0:
                c=sql.cursor()
                iArt+=1
                c.execute('INSERT INTO artistes(nom,status,path) VALUES("'+artiste+'",99,"'+artiste+'/")'.encode('utf8')

谁是漂亮的一面展示在文件中写入艺人坏到BDD。 问题是什么 ?

Answer 1:

您不需要编码被编码的数据。 当您尝试这样做,Python会首先尝试对其进行解码 ,以unicode ,才可以对其进行编码,回UTF-8。 这就是在这里失败:

>>> data = u'\u00c3'            # Unicode data
>>> data = data.encode('utf8')  # encoded to UTF-8
>>> data
'\xc3\x83'
>>> data.encode('utf8')         # Try to *re*-encode it
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)

只需直接写您的数据文件,也没有必要编码已编码的数据。

如果改为建立unicode价值观相反,你的确会不得不编码这些可写的文件。 你想使用codecs.open()代替,它返回一个文件对象,将编码的Unicode值UTF-8为您服务。

你也真的不想写出来的UTF-8 BOM, 除非支持微软的工具,无法读取UTF-8,否则(如MS记事本)。

对于你的MySQL插入的问题,你需要做两件事情:

  • 添加charset='utf8'MySQLdb.connect()调用。

  • 使用unicode对象,而不是str查询或插入时对象,但是使用SQL参数,以便MySQL的连接器可以为你做正确的事情:

     artiste = artiste.decode('utf8') # it is already UTF8, decode to unicode c.execute('SELECT COUNT(id) AS nbr FROM artistes WHERE nom=%s', (artiste,)) # ... c.execute('INSERT INTO artistes(nom,status,path) VALUES(%s, 99, %s)', (artiste, artiste + u'/')) 

它实际上可能会更好地工作,如果您使用codecs.open()的内容,而不是自动解码:

import codecs

sql = mdb.connect('localhost','admin','ugo&(-@F','music_vibration', charset='utf8')

with codecs.open('config/index/'+index, 'r', 'utf8') as findex:
    for line in findex:
        if u'#artiste' not in line:
            continue

        artiste=line.split(u'[:::]')[1].strip()

    cursor = sql.cursor()
    cursor.execute('SELECT COUNT(id) AS nbr FROM artistes WHERE nom=%s', (artiste,))
    if not cursor.fetchone()[0]:
        cursor = sql.cursor()
        cursor.execute('INSERT INTO artistes(nom,status,path) VALUES(%s, 99, %s)', (artiste, artiste + u'/'))
        artists_inserted += 1

您可能要刷上Unicode和UTF-8和编码。 我可以推荐以下相关文章:

  • 在Python的Unicode指南

  • 务实的Unicode由斯内德尔德

  • 绝对最低每一个软件开发人员绝对,积极必须知道的关于Unicode和字符集(没有借口!)由Joel Spolsky的



Answer 2:

不幸的是,string.encode()方法并不总是可靠的。 看看这个线程的详细资料: 什么是一些字符串(UTF-8或其他人)转换为在python简单的ASCII字符串的傻瓜证明的方式



文章来源: python encoding utf-8