2014-02-20 3 views
1

python 2.7.3을 사용하면 다음은 TypeError를 발생시키지 않습니다.왜 unicode (u '')가 errors 매개 변수를 전달합니까? TypeError

>>> unicode(u'') 
    u'' 

그러나 통과 errors 매개 변수는 TypeError: decoding Unicode is not supported

>>> unicode(u'',errors='replace') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: decoding Unicode is not supported 

>>> unicode(u'',errors='ignore') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: decoding Unicode is not supported 

>>> unicode(u'',errors='strict') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: decoding Unicode is not supported 

이 너무 다르게 작동 왜 모든 추측을 제기? IMO,이 기능은 unicode 기능에 놀라운 놀라운 기능입니다. 기능 PyUnicode_FromEncodedObject에서 Python/unicodeobect.c에서


  1. 브라우징 파이썬 소스 코드, (난 그냥 올바른 코드 경로를 따라 야하는 추측을 취하고는) 우리는 오류 문자열 "decoding Unicode is not supported"을 찾을 수 있습니다. PyUnicode_Check(obj)이 0이 아닌 값을 반환하면 오류 문자열이 설정됩니다.

  2. Include/object.h에, PyUnicode_Check는 파이썬 코드 인해 errors 매개 변수를 전달하는 다른 코드 경로를 사용 어디 찾을 수 없습니다, 그러나 표현 (((Py_TYPE(obj))->tp_flags & (Py_TPFLAGS_UNICODE_SUBCLASS)) != 0)

을 평가합니다.

답변

0

는 I는 unicode() 함수 타입 string의 데이터를 취하는데와 unicode를 입력하지 않은 것 믿는다

유니() 생성자 서명 유니 (문자열 [, 부호화, 오류])이있다. 모든 인수는 8 비트 문자열이어야합니다. 첫 번째 인수는 지정된 인코딩을 사용하여 유니 코드로 변환됩니다.

>>> unicode('abcdef') u'abcdef' >>> s = unicode('abcdef') >>> type(s) <type 'unicode'> >>> unicode('abcdef' + chr(255)) Traceback (most recent call last): ... UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 6: ordinal not in range(128) 

u''

내가 아니라고 판단 빈 문자열 (인코딩됩니다 : 당신은 인코딩 인수를 생략 할 경우 127 오류로 처리됩니다보다는 ASCII 인코딩, 변환에 사용되는 큰 문자 너무한다 127보다 큰 문자). 인수를 인코딩하지 않아도됩니다. 그러나 유니 코드를 정기적으로 받아 들여야하기 때문에 unicode에서 오류가 발생합니다.

나는 지금 당장이 순간에 최선의 추측을 던지고있다. 그래서 어떤 수정이라도 인정 될 것이다.

+1

을하지만 당신은 자신의 예를 보면, 그는 빈 문자열을 전달한다 : 당신이 (ASCII 기본값) 다른 인코딩을 사용하고자하는 경우

>>> unicode(u''.encode('ascii', errors='replace')) 

. – thefourtheye

+1

나는 왜'unicode()'가'errors' 매개 변수 대'not '매개 변수가 주어 졌을 때 다르게 동작하는지에 대해 더 많은 질문이 있다고 생각합니다. –

+0

그는 빈 문자열의 유니 코드를 전달하며, 이는 여전히 유니 코드라고 가정합니다. 나는'Unicode()'가 실제 유니 코드 타입 데이터를 가져 가야한다고 생각하지 않는다. – ForgetfulFellow

2

unicode in Python (docs)은 문자열을 파이썬에서 문자열의 유니 코드 표현으로 변환하는 함수입니다. 그러나 인코딩 또는 오류 매개 변수를 전달할 경우 동작이 다릅니다.

인코딩 및/또는 에러가 주어지면, 유니 코드()가 8 비트의 문자열 또는 인코딩 용 코덱을 사용하여 문자 버퍼 일 수 있습니다 오브젝트를 디코딩한다. encoding 매개 변수는 인코딩 이름이 인 문자열입니다. 인코딩이 알려지지 않은 경우 LookupError가 발생합니다. 오류 처리는 오류에 따라 수행됩니다. 이 경우 입력 인코딩에서 유효하지 않은 문자를 문자로 처리합니다. 오류가 'strict'(기본값)이면 오류가 발생하면 ValueError가 발생하고 이면 '무시'값을 지정하면 오류가 자동으로 무시되고 'replace'값이 이면 공식 유니 코드 대체 문자 인 이 발생합니다. U + FFFD, 을 디코딩 할 수없는 입력 문자를 대체하는 데 사용됩니다. 코덱 모듈을 참조하십시오.

선택적 매개 변수가없는 경우 unicode()는 8 비트 문자열 대신 유니 코드 문자열을 반환한다는 점을 제외하고는 str()의 동작을 모방합니다. 보다 정확하게는 object가 유니 코드 문자열이거나 하위 클래스 인 경우 추가로 디코딩을 적용하지 않고 해당 유니 코드 문자열을 반환합니다.

u''을 유니 코드로 변환 할 수없는 이유는 이미 유니 코드 표현이기 때문입니다. 파이썬이 ascii 코덱 (기본 코덱, 지정하지 않았으므로)을 사용하여 디코드하려고하면 문자열이 이미 유니 코드로 인식되어 오류가 발생합니다 ("Python : 오이 왜 유니 코드를 변환하려고합니까? 문자열을 유니 코드로 변환 하시겠습니까? ")

docs에서 볼 수 있듯이 오류 매개 변수를 지정하지 않으면 유니 코드 문자열을 유니 코드로 변환 할 때 파이썬이 정상입니다. 이미 유니 코드 인 경우 추가 디코딩없이 유니 코드 문자열을 반환합니다.

standard link 사람들이 유니 코드가 무엇인지 이해하는 데 도움을줍니다.

이 작업을 실제로 수행하려면 (예를 들어 일반 문자열과 유니 코드 문자열을 모두 허용하는 코드를 작성하려는 경우) 유니 코드로 다시 변환하기 전에 문자열을 인코딩해야합니다.

예 :

>>> unicode(u''.encode('utf-8', errors='replace'), 'utf-8') 
+0

예제가 이해가되지 않습니다. 'encode'는 에러를 생성해서는 안되며 에러 지정자를 추가하는 것은 불필요합니다. 유니 코드 문자열을 유니 코드로 변환하려고 시도하는 이유에 관해서는 받아 들일 수있는 것을 용인하고자하는 코드를 작성하고 있지만 유니 코드 문자열로 무엇이든지 작업해야합니다. –

+0

에러 지정자는'encode' 함수가 아니라'unicode' 함수의 일부입니다 (실제로 포스터가 에러 지정자를 원하는 이유는 모르겠지만). 그러나 용서에 관해서는 좋은 지적을했습니다. 나는 그것에 대해 생각하지 않았습니다. 편집 됨. – icedtrees

+0

필자의 주장은'encode'는 오류가있는 어떤 출력도 생성하지 않기 때문에'errors'를 위해 무엇을 지정해도 문제가되지 않는다는 것입니다. –

관련 문제