2017-11-01 7 views
1

나는이 코드를 uicode 문자열에 persian이 있는지 확인하기 위해이 코드를 작성합니다.이 코드는 으로 바꿉니다. 내가 헤더에서이 인코딩을 사용하는 것은문자열에서 아랍어 단어 문자열을 찾습니다. 'ascii'코덱에서 디코딩 할 수 없습니다.

`#!/usr/bin/python 
# -*- coding: utf-8 -*-` 

이 달 변환 내 데프이다

def changeData(date): 
       if date: 
        date.encode('utf-8') 
        if "فروردین".encode('utf-8') in date: 
         return str.replace(":فروردین", ":1") 
        elif "اردیبهشت".encode('utf-8') in date: 
         return str.replace(":اردیبهشت", ":2") 
        elif "خرداد".encode('utf-8') in date: 
         return str.replace(":خرداد", ":3") 
        elif "تیر".encode('utf-8') in date: 
         return str.replace(":تیر", ":41") 
        elif "مرداد".encode('utf-8') in date: 
         return str.replace(":مرداد", ":5") 
        elif "شهریور".encode('utf-8') in date: 
         return str.replace(":شهریور", ":6") 
        elif "مهر".encode('utf-8') in date: 
         return str.replace(":مهر", ":7") 
        elif "آبان".encode('utf-8') in date: 
         return str.replace(":آبان", ":8") 
        elif "آذر".encode('utf-8') in date: 
         return str.replace(":آذر", ":9") 
        elif "دی".encode('utf-8') in date: 
         return str.replace(":دی", ":10") 
        elif "بهمن".encode('utf-8') in date: 
         return str.replace(":بهمن", ":11") 
        elif "اسفند".encode('utf-8') in date: 
         return str.replace(":اسفند", ":12") 

난 다음 함수에서 유니 코드 형식으로 날짜를 통과 encode('utf-8')로 변환하지만 나에게이 오류

if "فروردین".encode('utf-8') in date: 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd9 in position 0: ordinal not in range(128) 
을 제공

어떻게이 문제를 해결할 수 있습니까?

+0

Python 2.7을 사용합니까? – MaximTitarenko

+0

중복? https://stackoverflow.com/questions/9644099/python-ascii-codec-cant-decode-byte –

답변

1

파이썬 2.7 가정합니다.


그래서 '

"فروردین".encode('utf-8') 

당신에게 다음 코드와

print(repr("فروردین")) # '\xd9\x81\xd8\xb1\xd9\x88\xd8\xb1\xd8\xaf\xdb\x8c\xd9\x86' 

:

"فروردین".encode('utf-8') # UnicodeDecodeError: 'ascii' codec can't decode byte 0xd9 in position 0: ordinal not in range(128) 

문제는 파이썬 2.7 문자열이 바이트 있다는 사실이다 논리적 인 바이트를 인코딩하려고한다. 잘못된 이유는

ENCODING: unicode --> bytes 
DECODING: bytes --> unicode 

그러나 파이썬은 똑똑하기 때문에 파이썬, TypeError처럼 떨어지게 throw하지 않습니다.
그런 경우 먼저 지정된 바이트를 유니 코드로 디코딩 한 다음 사용자가 지정한 인코딩을 실행하려고합니다.
문제는 파이썬이 파이썬 2에서 ASCII 인 기본 인코딩으로 설명 된 디코딩을 수행한다는 것입니다. 따라서 프로그램은 UnicodeDecodeError으로 끝납니다. 당신은 바이트 문자열을 인코딩하지 않아야, 그래서

unicode("فروردین") # UnicodeDecodeError: 'ascii' codec can't decode byte 0xd9 in position 0: ordinal not in range(128) 

당신은 그것을 유니 코드 받기 위해 DECODE에 있습니다 :

기술 된 디코딩은 유사하다

u = "فروردین".decode('utf-8') 
print(type(u)) # <type 'unicode'> 

유니 코드를 얻는 또 다른 방법은 u - 일반 + 인코딩 선언을 사용하는 것입니다.

# coding: utf-8 

u = u"فروردین" 
print(type(u)) # <type 'unicode'> 

print(u == "فروردین".decode('utf-8')) # True 
+0

또는 소스 파일에서 utf-8을 선언하고'u '와 같이 문자열 앞에'u'를 붙입니다. فروردین " '- 그런 식으로''디코딩 ''을 호출 할 필요가 없습니다. – jsbueno

+0

@jsbueno, 동의 함 – MaximTitarenko