2014-10-09 5 views
3

일부 중국어 문자가 포함 된 json String으로 dict을 덤프하고 url 요청 매개 변수를 그와 함께 형식화하려고합니다. 또한json에서 중국어 문자를 'gbk'로 인코딩하는 방법, URL 요청 매개 변수 문자열을 포맷 하시겠습니까?

GET /?json=%7B%22num%22%3A+1%2C+%22key%22%3A+%22%5Cu6d93%5Cu5a43%5Cu6363%22%7D 
               ------------------------ 
                 | 
                 v 
      %5Cu6d93%5Cu5a43%5Cu6363 is 'some' format of chinese characters "上海" 

내가 :

GET /?json=%7B%22num%22%3A+1%2C+%22key%22%3A+%22%C9%CF%BA%A3%22%7D 
               ------------ 
                | 
                V 
         "%C9%CF%BA%A3" represent "上海" in format of 'gbk' in url. 

하지만 내가 가진 것은 이것이다 : 나는 요청 문자열의 기대했던

import httplib 
import simplejson as json 
import urllib 

d={ 
    "key":"上海", 
    "num":1 
} 

jsonStr = json.dumps(d,encoding='gbk') 
url_encode=urllib.quote_plus(jsonStr) 

conn = httplib.HTTPConnection("localhost",port=8885) 
conn.request("GET","/?json="+url_encode) 
res = conn.getresponse() 

이것이다 : 여기

내 파이썬 코드 ensure_ascii=False 옵션을 사용하여 json을 덤프하려고 시도했습니다.

jsonStr = json.dumps(d,ensure_ascii=False,encoding='gbk') 

하지만 운이 없다.

그래서 어떻게 만들 수 있습니까? 감사.

답변

2

거의 ensure_ascii=False입니다. 이 작품 :

jsonStr = json.dumps(d, encoding='gbk', ensure_ascii=False).encode('gbk') 

당신은 그것을 ASCII-년도 그들에게 시도해서는 안된다는 사실을 읽을 문자열이 GBK 것을 json.dumps() 말할 필요합니다. 그런 다음 json.dumps()에는 별도의 옵션이 없기 때문에 출력 인코딩을 다시 지정해야합니다. 내가 URI의 표준은 가능하면 그들이 UTF-8로해야한다는 말을 보인다주의해야하지만, https://stackoverflow.com/a/18337754/4323

그래서이 당신이 원하는 무엇을 :

이 솔루션은 다른 대답을 여기에 유사하다. 당신은 UTF-8로 소스 코드를 저장 https://stackoverflow.com/a/14001296/4323

+0

john에게 감사의 말을 전합니다. 정말 도움이됩니다. – armnotstrong

0
"key":"上海", 

, 그래서 이것은 바이트 문자열 '\xe4\xb8\x8a\xe6\xb5\xb7'입니다 :이에 대한 자세한 내용은 여기를 참조하십시오.

jsonStr = json.dumps(d,encoding='gbk') 

JSON 형식은 유니 코드 문자열 만 지원합니다. encoding 매개 변수를 사용하면 json.dumps에서 바이트 문자열을 허용하고 지정된 인코딩을 사용하여 유니 코드로 자동 디코딩 할 수 있습니다.

그러나 실제로 바이트 문자열의 인코딩은 'gbk'이 아니므로 json.dumps은 올바르게 디코딩되어 u'涓婃捣'이됩니다. 그런 다음 잘못된 JSON 출력 "\u6d93\u5a43\u6363"을 생성합니다. URL은 %22%5Cu6d93%5Cu5a43%5Cu6363%22으로 인코딩됩니다.

# coding: utf-8 

d = { 
    "key": u"上海", # or u'\u4e0a\u6d77' if you don't want to rely on the coding decl 
    "num":1 
} 
jsonStr = json.dumps(d) 
... 

이 당신에게 JSON "\u4e0a\u6d77", URL %22%5Cu4e0a%5Cu6d77%22에 인코딩을 얻을 것이다 :

은 ( u'') 문자열이 json.dumps에 적절한 유니 코드를 입력해야이 문제를 해결합니다.

당신이 정말이 JSON에서 \u 탈출을하지 않으려면 당신이 할 수있는 URL 인코딩 전에 실제로 ensure_ascii=False 다음 .encode() 출력.그러나 나는 URL 매개 변수에서 대상 응용 프로그램이 원하는 것을 인코딩하는 것에 대해 걱정해야하므로 권장하지는 않습니다. URL 매개 변수는 고통의 근원입니다. \u 버전은 모든 JSON 파서에서 허용되며 일반적으로 URL 인코딩 후 훨씬 오래 걸리지 않습니다.

+0

'json.dumps()'에서'encoding '매개 변수에 대한 오해를 지적 해 주셔서 고마워요. 하지만 여전히 혼란 스럽습니다. 'key = u '를 上海''로 설정하면'key'가 유니 코드로 저장됩니다. 그래서 콘솔에'key'라고 타이핑하면'u '\ u4e0a \ u6d77''을 얻을 것이나'key.encode ('utf8')'''\ xe4 \ xb8 \ x8a \ xe6 \ xb5 \ xb7 ' ', 나는 파이썬이 기본 인코딩으로 유니 코드를 사용한다는 것을 알고 있으며, 유니 코드와 utf8은 같은가요? 아니면 다른 인코딩 형식일까요? 'u'\ u4e0a \ u6d77 '와'\ xe4 \ xb8 \ x8a \ xe6 \ xb5 \ xb7 ''사이의 관계는 무엇이고 파이썬의 메모리에 저장된 '上海'의 데이터는 무엇일까요? 정말 혼란 스럽네. – armnotstrong

+0

유니 코드 문자열은 0x000000-0x10FFFF의 번호가 매겨진 일련의 문자입니다. 바이트 문자열은 0x00-0xFF의 번호가 매겨진 일련의 바이트입니다. 일부 또는 모든 문자를 하나 또는 일련의 바이트로 매핑하는 많은 인코딩이 있습니다. 대부분은 아니지만 모든 인코딩이 ASCII 호환이므로 바이트 0x00-0x7F 각각이 동일한 번호의 유니 코드 문자에 직접 매핑됩니다. 모든 문자를 바이트 시퀀스로 매핑하는 인코딩을 UTF라고합니다. 가장 조밀 한 ASCII 양립 한 UTF이기 때문에 UTF-8는 일반적으로 바람직한 것으로 간주됩니다. – bobince

+0

유니 코드는 인코딩이 아니지만 Microsoft는 메모장과 같은 응용 프로그램의 인터페이스에서 UTF-16LE 인코딩 "유니 코드"를 호출하여 사람들을 혼란스럽게합니다. UTF-16LE은 ASCII 호환이 아니며 일반적으로 교환 형식으로는 문제가 있지만 많은 시스템에서는 Windows에서 Python 2.x를 포함한 내부 저장 형식으로 사용합니다. 그러나 다른 환경에서는 파이썬이 다른 인코딩을 사용할 수 있습니다. 모든 플랫폼에서 파이썬 3.3부터 여러 인코딩으로 전환합니다. 파이썬 스크립트 제작자는 일반적으로 장면의 배후에있는 저장 형식을 신경 쓰지 않아도됩니다. – bobince