2010-07-20 3 views
9

파이썬 문자열을 URL로 인코딩하고 히브리어 문자열로 예외가 발생했습니다. 문제를 해결할 수 없어 추측 지향 프로그래밍을 시작했습니다. 마지막으로, URL 인코더로 보내기 전에 mystr = mystr.encode("utf8")을 저장하면 하루가 절약됩니다.파이썬 : "...". encode ("utf8") 수정은 무엇입니까?

누군가 무슨 일이 일어 났는지 설명 할 수 있습니까? .encode ("utf8")의 기능은 무엇입니까? 내 원래 문자열은 유니 코드 문자열이었습니다 (예 : u로 시작).

+9

직접적인 답변은 아니지만이 텍스트는 읽을 가치가 있습니다. 모든 소프트웨어 개발자는 절대적으로 최소, 유니 코드와 문자 집합에 대해 알 필요가 있습니다. (http : //www.joelonsoftware. com/articles/Unicode.html) by Joel Spolsky – balpha

+8

추측 지향 프로그래밍. 이제 이것이 인기있는 패러다임입니다. 내 경험으로 기본에 대해 배워두는 – Amnon

+0

(여기서하는 것처럼)이 더 효과적입니다. – Amnon

답변

9

원본 문자열은 원시코드 포인트를 포함하는 유니 코드 개체이며, UTF-8로 인코딩 한 후 UTF-8 인코딩 된 데이터가 들어있는 일반 바이트 문자열입니다.

URL 인코더는 바이트 문자열을 필요로하기 때문에 한 바이트 씩 URL 인코딩 할 수 있으며 유니 코드 코드 포인트를 처리 할 필요가 없습니다. 유니 코드 객체를 주면, 그것은 아마도 ASCII와 같은 기본 인코딩을 사용하여 바이트 문자열로 변환하려고 시도합니다. ASCII로 표시 할 수없는 히브리어 문자의 경우 오류가 발생합니다.

1

"..."encode ("utf-8")는 문자열의 메모리 내 표현을 UTF-8로 인코딩 된 문자열로 변환합니다.

url encoder 예상되는 bytestring, 즉 각 문자가 단일 바이트로 표시되는 문자열 표현.

0

유니 코드 문자열 인 mystr의 UTF-8 인코딩 버전을 반환합니다. UTF-8은 유니 코드를 인코딩하는 단순한 방법이라는 것을 인식하는 것이 중요합니다. 파이썬은 다른 많은 인코딩 (예 : mystr.encode ("utf32") 또는 심지어 mystr.encode ("ascii"))과 함께 작동 할 수 있습니다.

0

link balpha가 게시 한 모든 내용을 설명합니다. 짧게 :

문자열 앞에 "u"가 붙어 있다는 사실은 유니 코드 문자 (또는 코드 포인트)으로 구성되었다는 것을 의미합니다. UTF-8은이 문자열을 바이트의 시퀀스로 인코딩 한 것입니다.

13

내 원래 문자열 (즉, U 접두어) 어쨌든 유니 코드 문자열

... 문제가 있었다. 그것은 "문자열"이 아니라 "유니 코드 객체"였습니다. 유니 코드 코드 포인트의 시퀀스를 포함합니다. 물론이 코드 포인트는 파이썬이 알고있는 내부 표현을 가지고 있어야하지만, 추상화 된 것은 모두 print repr(my_u_str) 일 때 \uXXXX 엔티티로 표시됩니다.

다른 프로그램에서 이해할 수있는 바이트 시퀀스를 얻으려면 유니 코드 코드 포인트 시퀀스를 가져 와서 인코딩해야합니다. 선택할 수있는 요소가 많기 때문에 인코딩을 결정해야합니다. UTF8 및 UTF16은 일반적인 선택입니다. ASCII가 맞을 수도 있습니다. u"abc".encode('ascii')은 정상적으로 작동합니다. 첫 번째는 <type 'unicode'>이고 두 번째는 <type 'str'>이다

my_u_str = u"\u2119ython" 다음과 type(my_u_str)type(my_u_str.encode('utf8'))이 유형의 차이를보기 위해 수행. (파이썬 2.5와 2.6에서, 어쨌든).

모든 것은 파이썬 3에서 다르지만, 거의 사용하지 않았기 때문에 그것에 대해 권위있는 것을 말하려고하면 모자를 쓰지 않을 것입니다.

+0

+1 좋은 설명. –

+0

[This] (https://tools.ietf.org/html/rfc3986)는 utf-8에 ASCII가 아닌 것을 의미하는 것으로 보입니다. 또한 w3schools에서 가져온 것이면 권한이 없다는 것을 의미합니다. w3fools.com – stommepoes

4

.encode ("utf8")의 기능은 무엇입니까?

파이썬 3.x의에서
  • , 그것은 bytes 개체로 (UTF-16 또는 UTF-32으로 인코딩)을 str 객체를 변환합니다

파이썬 버전에 사용중인 따라 달라집니다 문자열의 UTF-8 표현을 포함합니다.

  • Python 2.x에서는 unicode 개체를 UTF-8로 인코딩 된 str 개체로 변환합니다. 그러나 strencode 방법을 가지고 있으며, '...'.encode('UTF-8')을 쓰는 것은 '...'.decode('ascii').encode('UTF-8')을 쓰는 것과 같습니다.
  • "u"접두사를 언급 했으므로 2.x를 사용해야합니다. 2.x 전용 라이브러리가 필요하지 않다면, 텍스트와 바이너리 데이터를 명확히 구별하는 3.x로 전환하는 것이 좋습니다.

    Dive into Python 3에는 좋은 설명이 있습니다.

    어떤 일이 일어 났는지 설명 할 수 있습니까?

    오류 메시지의 내용을 알려 주시면 도움이됩니다.

    urllib.quote 함수는 str 개체를 필요로합니다. 또한 ASCII 문자 만 포함하는 개체는 unicode과 함께 작동하지만 히브리어 문자가 포함 된 개체는 작동하지 않습니다. 파이썬 3.X에서

    urllib.parse.quote 모두 str (= 파이썬 2.X unicode) 및 bytes 객체를 받아 들인다. 문자열은 UTF-8로 자동 인코딩됩니다.

    관련 문제