2016-07-09 5 views
1

.rtf 파일을 읽는 프로그램을 만들고 있습니다. .rtf 파일은 ASCII로 인코딩되지만 이스케이프 시퀀스와 함께 UTF-16 더블 바이트를 나타내는 두 개의 숫자가 나오는 비 ASCII 문자를 나타냅니다. 예를 들어 "これ은 日本語."는 "\ '82 \ 'b1 \ '82 \'ea \ '82 \ 'cd \ '93 \'fa \ '96 \ '7b \'8c \ 'ea \ '81 \ '42 "입니다.어떻게 파이썬에서 UTF-16 바이트 시퀀스의 문자열 표현을 UTF-8로 변환합니까?

내 프로그램의 목적에 따라 코드 페이지는 항상 "cpg1252"입니다.

"\ 'xx"시퀀스를 UTF-8 문자열로 변환하려면 어떻게해야합니까? 나는 코덱으로 놀아 보려고 노력했지만, 나는 모두 횡설수설했다.

+1

RTF는 UTF-16 코드 단위를 인코딩하기 위해 * 부호있는 정수 *를 사용합니다. 실제로는 앞에 '\ u' 접두사가 붙고 그 뒤에 대체 문자가옵니다. –

+0

내 .rtf 파일에 "\ u"인스턴스가 없습니다. "\ 'xx"는 UTF-16이 아닙니까? –

+0

나는 그것을 의심한다. UTF-16 리틀 엔디안 (모든 MS 제품이 사용하는 것)으로 인코딩 된 문자는 '53 30 8c 30 6f 30 e5 65 2c 67 9e 8a 02 30'입니다. 당신이 준 데이터는 그와 상관 관계가 없습니다. –

답변

0

Shift-JIS datacode-page escapes 안에 있습니다. 마크 업 된 바이트를 추출하여 디코드 할 수 있습니다.

import re 
from binascii import unhexlify 

cp_escapes = re.compile(r"\'([0-9a-fA-F]{2})") 

def extract_cp_escapes(data): 
    return unhexlify(''.join(marked_bytes.findall(data))) 

그런 다음 디코딩하십시오. Shift 키를 JIS는 코드 페이지 932 Windows에서 : 당신이 필요한 경우 당신은 UTF-8와 같은 다른 코덱이를 디코딩 할 수

>>> text = r"\'82\'b1\'82\'ea\'82\'cd\'93\'fa\'96\'7b\'8c\'ea\'81\'42" 
>>> extract_cp_escapes(text) 
'\x82\xb1\x82\xea\x82\xcd\x93\xfa\x96{\x8c\xea\x81B' 
>>> print extract_marked_bytes(text).decode('cp932') 
これは日本語。 

.

사용 된 정확한 코드 페이지도 RTF 문서로 인코딩 될 수 있지만 가능한 경우이를 조사해야합니다.