2011-08-23 5 views
2

요청을 전처리하기 위해 파이썬과 정보를 저장하는 MySQL 데이터베이스를 사용하여 웹 사이트를 개발 중입니다.이 이중 인코딩을 해결하는 방법은 무엇입니까?

내 모든 테이블은 utf8이고 utf8도 Content-type으로 사용됩니다.

print results.encode("utf-8") 

가를 표시합니다 :이 같은 간단한 SELECT 쿼리의 결과를 인쇄 호스팅 내에서 GoDaddy에 대한 간단한 테스트를 실행

database_connection = MySQLdb.connect(host = database_host, user = database_username, passwd = database_password, db = database_name, use_unicode = True) 
cursor = database_connection.cursor() 
cursor.execute("""SET NAMES utf8;"""); 
cursor.execute("""SET CHARACTER SET utf8;"""); 
cursor.execute("""SET character_set_connection=utf8;"""); 

:

나는 DB에 연결을 설정하기 위해이 코드를 이중으로 인코딩 된 문자열. (따라서 ASCII 문자가 아닌 모든 문자는 두 개의 다른 스페셜로 변환됩니다.) 그러나 encode 문을두면 ASCII 문자가 아닌 문자 각각에 대해 인코딩 오류가 발생합니다.

+0

어떻게 결과가 표시됩니까? 웹 페이지에서? 당신 SSHing에 있습니까? 추측 해 보면 올바르게 인코딩되었지만 latin-1과 같은 싱글 바이트 인코딩이 필요한 환경에 표시되고 있습니다. –

+0

결과가 웹 페이지에 표시됩니다. 특수 문자를 표시하므로 환경이 유니 코드와 호환되어야합니다. 문제는 그것이 두 배로 인코딩 된 것 같습니다. ASCII가 아닌 모든 문자는 두 개의 다른 문자로 표시됩니다. 예를 들어 "ó"(작은 o는 예음) 문자는 "³"및 "ö"(소문자와 분음 기호)는 "¶"로 표시되지만 "ő" o)를 단 하나의 글자 "Å"로 사용하십시오. – kdani

+0

불행히도 '특수 문자'보다 복잡합니다. 다양한 문자 인코딩이 있으며 웹 브라우저는 HTTP 헤더와 HTML 메타 태그를 사용하여 어느 것을 사용할 것인지 결정합니다. Firefox를 사용하는 경우보기, 문자 인코딩, UTF-8을 사용하여이를 재정의 할 수 있습니다. 이것이 문제라면 HTML 템플릿을 수정해야 할 것입니다. –

답변

1

마치 results에 데이터베이스에서 오는 바이트 문자열에서 잘못 해독 된 유니 코드 문자열이있는 것처럼 들립니다. 나는. 데이터베이스에서 데이터를 읽을 때 실제로 UTF-8이 아닌 Latin-1로 바이트 문자열을 디코딩합니다.

데이터베이스 내용의 디코딩을 수정하면 비즈니스에 있어야합니다.

+0

네 말이 맞아! UTF-8 행만 디코딩해야했습니다. 나는 그들이 구식 MySQLdb 버전을 가지고 있기 때문에 그것이 GoDaddy 독점 문제라고 생각한다. 최신 버전에는 더 나은 인코딩 기능이 있습니다. 모든 답변들 주셔서 감사합니다! – kdani

0

나는 내 자신의 인코딩 사냥 중 하나를 인터넷에서 발견 한 이와 비슷한 것을 사용합니다. 적합성을 찾기 위해 연쇄 (chaining) 인코딩 스타일을 유지할 수 있습니다.

다른 사람이 말했듯이, 소스를 먼저 고정 시키십시오. 이 해킹은 인코딩이 실제로 반환되는지 파악하는 것입니다. 희망이 도움이됩니다.

#this method is a simple recursive hack that is going to find a compatible encoding for the problematic field 
#does not guarantee successful encoding match. If no match is found, an error code will be returned: ENC_ERR 

def findencoding(field, level): 
    print "level: " + str(level) 
    try: 
     if(level == 0): 
      field = field.encode('cp1252') 
     elif(level == 1): 
      field = field.encode('cp1254') 
     else: 
      return "ENC_ERR" 
    except Exception: 
     field = findencoding(field,level+1) 

    return field 
+0

field = row [0] 또는 결과의 다른 단일 필드를 사용하여 함수를 호출하면 레벨 0이 올바른 것으로 보이지만 전체 페이지에서 ENC_ERROR를 반환합니다. – kdani

+0

전체 페이지? 음 ...이 메서드를 사용하여 전체 페이지를 문자열로 인코딩하고 렌더링하려고합니까? 내 이해는 올바른 인코딩으로 결과를 변환하면 표시 할 수 있다는 것입니다. 이 경우 여러 인코딩이 관련되어있는 것으로 보입니다. 체인에 더 추가하고 레벨을 추가하고 해결 된 모든 컨텐츠를 얻을 수있는 곳을 확인할 수 있습니다. 가능한 경우 렌더링하려는 페이지의 내용을 게시 할 수 있습니까? – Urjit

+0

Template 클래스를 사용하여 페이지 내용을 생성합니다. 모든 문자열은 유니 코드 클래스의 객체입니다. 마지막 단계에서 encode 메서드 만 호출합니다. – kdani

관련 문제