2017-12-08 14 views
1

나는 문제를 보여주기 위해 단순화 된 버전을 작성했습니다. utf-8 및 UTF-16 형식의 특수 문자를 인코딩 중입니다.이상한 주요 문자 utf - 8/utf - 16 인코딩 파이썬에서

utf-8 인코딩에는 문제가 없습니다. UTF-16으로 인코딩 할 때 이상한 주요 문자가 나타납니다.

모든 후행 문자 및 주요 문자를 제거하려고했지만 오류가 계속 발생합니다. 코드의

샘플 : 출력의

#!/usr/bin/env python2 
# -*- coding: utf-8 -*- 

import chardet 


def myEncode(s, pattern): 
try: 
    s.strip() 
    u = unicode(s, pattern) 
    print chardet.detect(u.encode(pattern, 'strict')) 
    return u.encode(pattern, 'strict') 
except UnicodeDecodeError as err: 
    return "UnicodeDecodeError: ", err 
except Exception as err: 
    return "ExceptionError: ", err 

print myEncode(r"""Test !"#$%&'()*+-,./:;<=>[email protected][\]?_{@}~& € ÄÖÜ äöüß £¥§""", 
       'utf-8') 
print myEncode(r"""Test !"#$%&'()*+-,./:;<=>[email protected][\]?_{@}~& € ÄÖÜ äöüß £¥§""", 
       'utf-16') 

샘플 : 내가 잘못 가고

{'confidence': 0.99, 'language': '', 'encoding': 'utf-8'} 
Test !"#$%&'()*+-,./:;<=>[email protected][\]?_{@}~& € ÄÖÜ äöüß £¥§ 
{'confidence': 1.0, 'language': '', 'encoding': 'UTF-16'} 
��Test !"#$%&'()*+-,./:;<=>[email protected][\]?_{@}~& € ÄÖÜ äöüß £¥§ 

나는 그것을 알아낼 수 없습니다. 나는 UTF-16을 UTF-8로 다시 변환하고 싶지 않다. UTF-16으로 포맷을 유지하는 것이 중요하다.

업데이트 : @ 트위터 덕분에 내 문제의 해결책은 인코딩 UTF-16le 또는 UTF-16be를 정의하는 것입니다. 시간과 노력에 다시 한번 감사드립니다.

시간과 노력에 감사드립니다.

+1

는 바이트 순서 마크가 아닌가? (일명 BOM) –

+0

코드의 들여 쓰기가 잘못되었습니다. 검토하십시오. 코드 블록을 복사/붙여 넣기 한 다음 Ctrl 키를 누른 채로 코드 블록을 모두 들여 쓰기하면 보통 좋은 결과를 얻을 수 있습니다. – tripleee

+2

실제 바이트가 무엇인지 말하는 것은 아니며 UTF-16le 또는 UTF-16be인지 지정하지 않습니다. 터미널 문자 집합도 여기에서 재생됩니다. UTF-16 [BOM] (https://en.wikipedia.org/wiki/Byte_order_mark)의 실제 바이트는 0xff 0xfe이고 순서는 바이트 순서에 달려 있습니다. – tripleee

답변

0

문제는 @tripleee에 의해 제공되었습니다.

utf-16 대신 utf-16le 또는 utf-16be를 정의하면이 문제가 해결됩니다. 용액

샘플 : 출력

#!/usr/bin/env python2 
# -*- coding: utf-8 -*- 

import chardet 


def myEncode(s, pattern): 
    try: 
     s.strip() 
     u = unicode(s, pattern) 
     print chardet.detect(u.encode(pattern, 'strict')) 
     return u.encode(pattern, 'strict') 
    except UnicodeDecodeError as err: 
     return "UnicodeDecodeError: ", err 
    except Exception as err: 
     return "ExceptionError: ", err 

print myEncode(r"""Test !"#$%&'()*+-,./:;<=>[email protected][\]?_{@}~& € ÄÖÜ äöüß £¥§""", 
       'utf-8') 
print myEncode(r"""Test !"#$%&'()*+-,./:;<=>[email protected][\]?_{@}~& € ÄÖÜ äöüß £¥§""", 
       'utf-16be') 

샘플 :

{'confidence': 0.99, 'language': '', 'encoding': 'utf-8'} 
Test !"#$%&'()*+-,./:;<=>[email protected][\]?_{@}~& € ÄÖÜ äöüß £¥§ 
{'confidence': 0.99, 'language': '', 'encoding': 'utf-8'} 
Test !"#$%&'()*+-,./:;<=>[email protected][\]?_{@}~& € ÄÖÜ äöüß £¥§