복붙노트

[PYTHON] 파이썬 인코딩 utf-8

PYTHON

파이썬 인코딩 utf-8

나는 파이썬에서 몇몇 스크립트를하고있다. 파일에 저장하는 문자열을 만듭니다. 이 문자열은 디렉토리의 arborescence와 파일 이름에서 오는 많은 양의 데이터를 가지고 있습니다. convmv에 따르면, 내 모든 arborescence는 UTF-8입니다.

나는 이후에 MySQL에 저장하기 때문에 모든 것을 UTF-8로 유지하려고합니다. 지금은 UTF-8 인 MySQL에서 일부 문자 (예 : é 또는 è - 나는 프랑스어)에 문제가 있습니다.

그 파이썬은 항상 문자열을 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'코덱은 2171 위치의 0xc3 바이트를 디코딩 할 수 없습니다. 서수가 범위에 없습니다 (128)

편집하다: 나는 내 파일에서 악센트가 멋지게 기록 된 것을 본다. 이 파일을 만든 후에는 그것을 읽고 MySQL에 작성합니다. 하지만 이유는 모르겠지만 인코딩 문제가 있습니다. 내 MySQL 데이터베이스는 utf8에 있거나 SQL 쿼리 SHOW 변수 인 것처럼 보입니다. '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에 나쁜 내용을 씁니다. 문제가 무엇입니까?

해결법

  1. ==============================

    1.이미 인코딩 된 데이터를 인코딩 할 필요가 없습니다. 그렇게하려고 할 때, 파이썬은 우선 유니 코드로 디코드하여 UTF-8로 다시 인코딩 할 수 있습니다. 이것이 여기서 실패한 것입니다 :

    이미 인코딩 된 데이터를 인코딩 할 필요가 없습니다. 그렇게하려고 할 때, 파이썬은 우선 유니 코드로 디코드하여 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 값을 대신 작성한다면 실제로 파일에 쓸 수 있도록 인코딩해야합니다. 대신 unicode 값을 UTF-8로 인코딩 할 파일 객체를 반환하는 codecs.open ()을 사용하려고합니다.

    그렇지 않으면 MS 메모장과 같이 UTF-8을 읽을 수없는 Microsoft 도구를 지원해야하는 경우가 아니면 UTF-8 BOM을 쓰지 않으려 고합니다.

    MySQL 삽입 문제로 인해 다음 두 가지 작업을 수행해야합니다.

    실제로 내용을 디코딩하기 위해 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
    

    유니 코드와 UTF-8 및 인코딩을 다룰 수도 있습니다. 다음 기사를 추천 할 수 있습니다.

  2. ==============================

    2.아쉽게도 string.encode () 메서드는 항상 신뢰할 만하지는 않습니다. 자세한 정보는이 스레드를 확인하십시오 : 파이썬에서 간단한 문자열로 utf-8 또는 다른 문자열을 변환하는 어리석은 방법은 무엇입니까?

    아쉽게도 string.encode () 메서드는 항상 신뢰할 만하지는 않습니다. 자세한 정보는이 스레드를 확인하십시오 : 파이썬에서 간단한 문자열로 utf-8 또는 다른 문자열을 변환하는 어리석은 방법은 무엇입니까?

  3. from https://stackoverflow.com/questions/15092437/python-encoding-utf-8 by cc-by-sa and MIT license