2016-06-29 4 views
0

유니 코드 문자가 포함 된 변수 목록이 있는데 그 중 일부는 오존 가스와 같은 화학 물질에 대한 것입니다 (예 : 'O \ u2083'). 이들 모두는 sqlite 데이터베이스에 저장되어 있습니다.이 데이터베이스는 Python 코드로 읽혀 O 을 생성합니다. 그러나, 내가 읽을 때 나는 'O \\ u2083'을 얻는다. sqlite 데이터베이스는 'O \ u2083'문자열을 포함하는 csv 파일을 사용하여 작성됩니다. \ u2083가 유니 코드 문자로 sqlite 데이터베이스에 저장되는 것이 아니라 6 개의 유니 코드 문자 (\, u, 2,0,8,3)로 저장된다는 것을 알고 있습니다. 이 컨텍스트에서 유니 코드 문자를 인식 할 수있는 방법이 있습니까? 이제 문자를 인식하고 유니 코드 문자를 대체하는 함수를 만드는 것이 첫 번째 방법입니다. 이미 구현 된 것과 같은 것이 있습니까?파일/sqlite 데이터베이스에서 유니 코드 문자 읽기 및 파이썬에서 사용

답변

1

바이트 문자열 (길이 7)이있는 경우 유니 코드 이스케이프를 디코딩하십시오.

>>> s = 'O\u2083' 
>>> len(s) 
7 
>>> s 
'O\\u2083' 
>>> print(s) 
O\u2083 
>>> u = s.decode('unicode-escape') 
>>> len(u) 
2 
>>> u 
u'O\u2083' 
>>> print(u) 
O₃ 

경고 : 문자를 인쇄하는 데 사용 콘솔/IDE는 문자를 지원하는 인코딩을 사용할 필요하거나 인쇄 할 때 당신은 UnicodeEncodeError를 얻을 수 있습니다. 글꼴은 기호를 지원해야합니다.

+0

완벽한 !!!! 정확히 내가 필요로하는 것! 정말 고맙습니다! – awulll

+1

@awulll : 대부분의 경우'.decode ('unicode-escape')는 코드 (또는 업스트림)의 버그를 나타냅니다. 사용하지 마십시오. 코어 문제를 무시하면서 표면 증상을 수정합니다. 예를 들어 입력 형식에 JSON 텍스트가 포함되어있는 경우 정확한 해결책은'unicode-escape' 대신 'json' 모듈을 사용하여 파싱해야합니다. 실제 입력 형식이 무엇인지 알아보기에 충분하지는 않습니다. SQLite는 바이트 시퀀스 대신에 단일 유니 코드 문자를 저장할 수 있고 있어야합니다. 데이터베이스 및/또는 cvs 파일에 데이터를 쓰는 프로세스를 수정하십시오. – jfs

+0

@ J.F.Sebastian, 의견 주셔서 감사합니다. 귀하의 답변도 유용합니다. '유니 코드 - 이스케이프 (unicode-escape)'는 모든 제 물건에서 작은 부분 일뿐입니다.하지만 앞으로는 일부 SQLite 데이터베이스를 다시 작성해야하며 조언이 고려 될 것입니다. 고맙습니다! – awulll

1

모든 것이 바이트임을 기억하는 것이 중요합니다. 유용한 바이트를 가져 오기 위해 데이터를 가져올 때 어떤 인코딩이 사용되는지 알아야합니다. 데이터를 분석하여 인코딩을 결정하기에는 너무 많은 모호한 경우가 있습니다. 프로그램에서 데이터를 보내면 모두 다시 바이트로 바뀝니다. Python 2.x 또는 3.x를 사용하는지 여부에 따라 유니 코드 및 Python과 매우 다른 경험을하게됩니다.

그러나 인코딩을 시도하고 오류가 발생하면 "바꾸기"만하면됩니다. 예를 들어 the_string.encode("utf-8","replace")은 utf-8로 인코딩하려고 시도하고 ?으로 문제를 대체합니다. 문제가있는 문자를 미리 예상하여 교체 할 수는 있지만 관리하기가 쉽지 않습니다. 더 많은 교체 옵션을 보려면 codecs 클래스를보십시오.

+0

감사하지만, 요점은 필자 만의 경우 유니 코드이지만, '\ u2083'은 필자가 필요로하는 것만이 아니라 6 자다.필요한 것은 6 개의 문자 ('\ u2083')를 가진 하나의 문자열을 하나의 유니 코드 문자 (\ u2083, 오존의 작은 3)로 변환하고 이것을 다른 문자로 변환하는 것입니다. 유니 코드 테이블을 사용하여 함수를 수행하고 필요한 경우 일부를 대체 할 수 있지만 관리가 필요한 다른 방법이 있으면 좋을 것입니다. – awulll

1

SQLite를 사용하면 유니 코드 텍스트를 직접 읽고 쓸 수 있습니다. u'O\u2083'이고 두 개는 문자 u'O'u'\u2083'입니다 (질문에 오타가 있음 : 'u\2083' != '\u2083').

나는

돈 (2,0,8,3, \, U 될 것이다) u는 2083을 \ 유니 코드 문자로하지만 6 개 유니 코드 문자로 SQLite는 데이터베이스에 저장되지 않는 것을 이해 u'u\2083'u'\u2083'을 혼동하지 마십시오. 후자는 단일 문자이며 전자는 4 문자 시퀀스입니다. u'u', u'\x10' ('\20'은 파이썬에서 8 진수로 해석됩니다), u'8', u'3'입니다.

단일 유니 코드 문자 u'\u2083'을 SQLite 데이터베이스에 저장하면; 단일 유니 코드 문자로 저장됩니다 (데이터베이스 내에서 유니 코드의 내부 표현은 추상화가 유지되는 한 관련이 없습니다). 모듈의 상단에는 from __future__ import unicode_literals이없는 경우

파이썬 2에

는 다음 'abc' 문자열 리터럴 대신 유니 코드 문자열의 bytestring을 생성 -이 경우 모두 'u\2083''\u2083'바이트의 시퀀스는 문자 텍스트하지 (\uxxxx은 bytestrings 내에서 유니 코드 이스케이프 시퀀스로 인식되지 않습니다.

+0

지금 편집했습니다. 내 잘못 이었어. \ u2083입니다! 그 죄송합니다! – awulll