2012-02-24 1 views
1

내 프로그램에서 shift-jis 문자 코드를 해당 utf8 문자 코드 (정수이어야 함)로 변환해야하는 파이썬 정수로 사용합니다. 어떻게하면됩니까? ASCII의 경우 정수를 나중에 유니 코드로 쉽게 변환 할 수있는 ASCII 문자열로 변환 할 수있는 유용한 기능인 ord()/chr()이 있습니다. 나는 다른 인코딩을 위해 그런 것을 찾을 수 없다. 최종 코드 : 파이썬 2주어진 시프트 - jis 문자 코드를 utf-8 문자 코드로 받으시겠습니까?

편집을 사용하여

. 모두 감사합니다 :

def shift_jis2unicode(charcode): # charcode is an integer 
    if charcode <= 0xFF: 
     string = chr(charcode) 
    else: 
     string = chr(charcode >> 8) + chr(charcode & 0xFF) 

    return ord(string.decode('shift-jis')) 

print shift_jis2unicode(8140) 
+0

그것은 정수로가 아닌 바이트로 얻을 이례적인 - 뭔가 있다는 것입니다 너 바꿀 수있어? –

+0

죄송합니다, 할 수 없습니다. BTW, 나는 "바이트"가 파이썬 3에서 새로운 것 같아서 2를 사용한다고 생각한다. –

+0

파이썬 2의'str'은 바이트처럼 작동하며 2.6과 2.7에'bytes' 앨리어스를 갖는다. –

답변

2

"utf8 문자 코드 (정수 여야 함)"와 같은 것은 없습니다.

유니 코드는 "코드 포인트"를 정의하며 정수입니다. UTF-8은 이러한 코드 포인트를 바이트 배열로 변환하는 방법을 정의합니다.

그래서 라고 생각하면 유니 코드 코드 포인트가 필요합니다. 이 경우 :

def shift_jis2unicode(charcode): # charcode is an integer 
    if charcode <= 0xFF: 
     shift_jis_string = chr(charcode) 
    else: 
     shift_jis_string = chr(charcode >> 8) + chr(charcode & 0xFF) 

    unicode_string = shift_jis_string.decode('shift-jis') 

    assert len(unicode_string) == 1 
    return ord(unicode_string) 

print "U+%04X" % shift_jis2unicode(0x8144) 
print "U+%04X" % shift_jis2unicode(0x51) 

(또한 : 나는 8100 유효한 변화-JIS 문자 코드라고 생각하지 않습니다 ...)

+0

8100은 일종의 추측이며 잘못된 것입니다. 모든 유니 코드 대 utf-8 비즈니스를 얻지 마십시오. 나는 네가 옳다고 생각한다. –

+0

@AlexC, 유니 코드 문자열은 코드 포인트 (일반적으로 문자 당 하나)로 구성되며 'ord'는 코드 포인트를 정수로 변환합니다. UTF-8은 하나 이상의 8 비트 바이트로 된 코드 포인트를 나타냅니다. –

+0

"codepoint"죄송합니다. –

1

더 좋은 방법이있을 수 있지만 여기에는 다른 답변이 없으므로 여기에 옵션이 있습니다.

당신은 파이썬 유니 코드 객체로 데이터를 변환 할 unichr()를 사용 후, 유니 코드 코드 포인트로 시프트 JIS의 정수를 변환하는 this table를 사용하고 unicode.encode('utf-8')를 사용하여 UTF8로 유니 코드로 변환 할 수있다.

+0

감사합니다. 이미 사용자 정의 테이블을 사용하고 있습니다. 파이썬이 제공하는 것을 사용할 수 있다면, 코드가 더 깨끗해졌고 모든 문자 코드를 담고있는 여분의 파일을 가질 필요가 없다고 생각했습니다. –

0
def from_shift_jis(seq): 
    chars = [chr(c) if c <= 0xff else chr(c>>8) + chr(c&0xff) for c in seq] 
    return ''.join(chars).decode('shift-jis') 

utf8_output = [ord(c) for c in from_shift_jis(shift_jis_input).encode('utf-8')] 
+0

"chr (c >> 8) + chr (c & 0xff)"의 기능은 무엇입니까? –

+0

@AlexC,'c >> 8 '은 정수의 상위 8 비트를 하위 8 비트로 이동시키고,'c & 0xff '는 상위 8 비트를 제거합니다. 정수를 두 개의 8 비트 파트로 분할하는 방법입니다. 'chr'는 아는대로 문자로 변환되고'+'는 두 문자로 된 문자열에 문자를 추가합니다. –

+0

확인. 지금은 실제로 유니 코드 문자열을 utf-8 문자 코드 정수로 변환하는 데 문제가 있습니다. 나는 지금까지 가지고있는 코드로 내 질문을 업데이트 할 것이다. –