2014-11-11 2 views
0

Windows 7 64 비트, Python 3, MongoDB 및 PyMongo를 사용하고 있습니다. 파이썬 3에서는 모든 문자열이 유니 코드라는 것을 알고 있습니다. 또한 MongoDB가 모든 문자열을 유니 코드로 저장한다는 것도 알고 있습니다. 그래서 왜, 특정 필드의 값이 "C : \ Some Folder \ E = mc².xyz"인 데이터베이스에서 문서를 가져올 때, 파이썬은 그 문자열을 "C : \ Some Folder \ E = mc².xyz ". 그렇게 인쇄하는 것이 아닙니다. os.path.exists()는 False를 반환합니다. 이제는 충분히 혼란스럽지 않은 것처럼 문자열을 텍스트 파일에 저장 한 다음 "utf-8"로 명시 적으로 설정된 인코딩으로 열면 문자열이 올바르게 표시되고 os.path.exists() True를 반환합니다. 무엇이 잘못 되었습니까? 어떻게 수정합니까?Python 3에서 MongoDB의 유니 코드 문자열을 올바르게 처리하는 방법은 무엇입니까?

편집 : 당신이 볼 수 있듯이

from pymongo import MongoClient 

db = MongoClient().test_db 
orig_doc = {'string': 'E=mc²'} 
_id = db.test_col.insert(orig_doc) 
new_doc = db.test_col.find_one(_id) 
print(new_doc['string']) 

>>> E=mc² 

, 정확히 예상대로 작동합니다 여기 난 그냥 내 문제를 보여주기 위해 쓴 일부 코드입니다! 따라서 PostgreSQL에서 이전했을 때 나는 엉망이되었음을 깨달았습니다. 이제 문자열을 수정하면됩니다. 가능하다는 것을 알고 있지만 문자열을 텍스트 파일에 쓰고 다시 읽는 것보다 나은 방법이 있어야합니다. I 일 수 있습니다. 이전 테스트에서했던 것처럼, 올바른 방법처럼 보이지 않습니다.

+0

일부 코드를 포함 할 수 있습니까? 인코딩을 지정하는 설정이나 호출이 누락 된 것 같습니다. 실제로 잘못된 정보는 없습니다. 잘못된 인코딩으로 만 데이터를 다시 가져옵니다. –

답변

0

유니 코드를 저장할 수 없습니다. 그것은 개념이다. MongoDB는 유니 코드의 인코딩을 사용해야하며, 그것은 UTF-8처럼 보입니다. Python 3 유니 코드 문자열은 문자열의 내용에 따라 여러 인코딩 중 하나로서 내부적으로 저장됩니다. 당신이해야하는 것은 잘못된 인코딩을 유니 코드로 디코딩 된 문자열입니다 :

>>> s='"C:\Some Folder\E=mc².xyz"' # The invalid decoding. 
>>> print(s) 
"C:\Some Folder\E=mc².xyz" 
>>> print(s.encode('latin1').decode('utf8')) # Undo the wrong decoding, and apply the right one. 
"C:\Some Folder\E=mc².xyz" 

이 방법을 제대로 MondoDB을 읽는 당신에게 충분한 정보가 아니다, 그러나 이것은 당신을 따라 도움이 될 것입니다.

+0

내 게시물 편집을 완료하기 직전에 회신이 왔습니다. 방금 솔루션을 테스트 한 결과 작동합니다! 무리 감사! – Steohawk

관련 문제