์์ฒญ์ ์ต์ ๋ฒ์ ์
๋๋ค.
ํ์๊ฐ ํฌํจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ ค๊ณ ํ๋ฉด ์ด ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
Traceback (most recent call last):
File "X/threading.py", line 639, in _bootstrap_inner
File "X/threading.py", line 596, in run
File "C:\Users\Administrator\Dropbox\Sublime3056\Data\Packages\SublimeApex\salesforce\api.py", line 546, in execute_anonymous
headers=headers)
File "C:\Users\Administrator\Dropbox\Sublime3056\Data\Packages\SublimeApex\requests\api.py", line 88, in post
return request('post', url, data=data, **kwargs)
File "C:\Users\Administrator\Dropbox\Sublime3056\Data\Packages\SublimeApex\requests\api.py", line 44, in request
return session.request(method=method, url=url, **kwargs)
File "C:\Users\Administrator\Dropbox\Sublime3056\Data\Packages\SublimeApex\requests\sessions.py", line 338, in request
resp = self.send(prep, **send_kwargs)
File "C:\Users\Administrator\Dropbox\Sublime3056\Data\Packages\SublimeApex\requests\sessions.py", line 441, in send
r = adapter.send(request, **kwargs)
File "C:\Users\Administrator\Dropbox\Sublime3056\Data\Packages\SublimeApex\requests\adapters.py", line 292, in send
timeout=timeout
File "C:\Users\Administrator\Dropbox\Sublime3056\Data\Packages\SublimeApex\requests\packages\urllib3\connectionpool.py", line 428, in urlopen
body=body, headers=headers)
File "C:\Users\Administrator\Dropbox\Sublime3056\Data\Packages\SublimeApex\requests\packages\urllib3\connectionpool.py", line 280, in _make_request
conn.request(method, url, **httplib_request_kw)
File "X/http/client.py", line 1049, in request
File "X/http/client.py", line 1086, in _send_request
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 1632-1633: ordinal not in range(256)
ํ์ผ "X/http/client.py"
๋ก์ปฌ ํ์ผ์ ๊ฒฝ๋ก์ด๊ธฐ ๋๋ฌธ์ X
๋ผ๊ณ ์ผ์ต๋๊น? ๊ทธ๋ ๋ค๋ฉด ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๊ฐ urllib3๋ฅผ ํผ๋ํ ์ ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์์ฒญ์ ์ฒ๋ฆฌํด์ผ ํ๋ค๊ณ ์๊ฐํ๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ bugs.python.org์์ ์ด ๋ฌธ์ ๋ฅผ ์ ๊ธฐํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ httplib
(๋๋ Python 3์ http
์์ ์ฌ์ฉํ๊ณ ์๋ ๊ฒ์ผ๋ก ์ถ์ธก๋จ)์์ ์์นํ๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค.
@sigmavirus24 ,
๋๋ sublime ํ๋ฌ๊ทธ์ธ์์ ์์ฒญ์ ์ฌ์ฉํ๋๋ฐ, ์๋ ๊ตฌ๋ฌธ์ soap_body์ ํ์๊ฐ ํฌํจ๋์ด ์์ง ์์ผ๋ฉด ์์ธ๊ฐ ์์ต๋๋ค.
response = requests.post(self.apex_url, soap_body, verify=False, headers=headers)
์ฒซ์งธ, ๊ณต๊ฐ ์ ์ฅ์์ ์๋ ๊ฒ๊ณผ ๋ค๋ฅธ ๋ฒ์ ์ Sublime Apex๋ฅผ ์ฌ์ฉํ์ง ์๋ ํ Requests๋ ์ต์ ๋ฒ์ ์ด ์๋๋ผ 1.2.3 ๋ฒ์ ์ ๋๋ค. ์ฌ์ฉํ๊ณ ์๋ Sublime Text์ ๋ฒ์ ์ ์๋ ค์ฃผ์ค ์ ์์ต๋๊น?
์ญ๊ณ ํ ํ ์คํธ 3056์ ๋๋ค.
๋ฐ๋ผ์ ST 3์ด์ง๋ง ๊ฐ์ฅ ์ต๊ทผ์ ๊ฐ์ ํ์ ์๋๋๋ค. ์ข์, ๊ทธ๊ฒ์ ์ฐ๋ฆฌ์๊ฒ ๋ญ๊ฐ๋ฅผ ์ค๋ค. ํนํ Sublime Text 3๋ Python 2.7(Sublime Text 2์์ ์ฌ์ฉ)์ด ์๋ Python 3.3์ ์ฌ์ฉํฉ๋๋ค. ์ฆ, Sublime Apex์ ๋ชจ๋ ๊ธฐ๋ณธ ๋ฌธ์์ด์ ์ ๋์ฝ๋ ๋ฌธ์์ด์ ๋๋ค.
Python 3.3 http.client
ํ์ผ์ ์ด๋ฉด _send_request()
ํจ์๊ฐ ๋ค์๊ณผ ๊ฐ์ด ํ์๋ฉ๋๋ค.
# Honor explicitly requested Host: and Accept-Encoding: headers.
header_names = dict.fromkeys([k.lower() for k in headers])
skips = {}
if 'host' in header_names:
skips['skip_host'] = 1
if 'accept-encoding' in header_names:
skips['skip_accept_encoding'] = 1
self.putrequest(method, url, **skips)
if body is not None and ('content-length' not in header_names):
self._set_content_length(body)
for hdr, value in headers.items():
self.putheader(hdr, value)
if isinstance(body, str):
# RFC 2616 Section 3.7.1 says that text default has a
# default charset of iso-8859-1.
body = body.encode('iso-8859-1')
self.endheaders(body)
์ด์ ISO-8859-1์ ์ฐ๋ฆฌ๊ฐ ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ์๋ ์ฝ๋ฑ์ธ Latin-1์ ๋ณ์นญ์ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง ๋ฌธ์ ๋ Sublime Apex๊ฐ ์์ฒญ์ ์ ๋์ฝ๋ ๋ฌธ์์ด ๋ณธ๋ฌธ์ ์ ๊ณตํ๊ณ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ด ๋ณธ๋ฌธ์ httplib๊ฐ ๋ฐ์ดํธ๋ก ์ธ์ฝ๋ฉํด์ผ ํฉ๋๋ค. RFC 2616์ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํ๋ฉด ํ์๋ฅผ ํฌํจํ์ง ์๋ Latin-1์ ์ํ๋ค๋ ๊ฒฐ๋ก ์ด ๋์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ถ๋ช ํ ์ธ์ฝ๋ฉ์ด ์คํจํ๊ณ ๋ฌธ์ ์ ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
Sublime Apex๊ฐ ๋ณด๋ด๋ ํค๋์์ UTF-8 ์ธ์ฝ๋ฉ ๋ฐ์ดํฐ(ํ์ฌ๋ ๊ฑฐ์ง๋ง์)๋ฅผ ์ ์กํ๋ค๊ณ ์ฃผ์ฅํ๋ค๋ ์ ์ ๊ณ ๋ คํ๋ฉด Sublime Apex๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๊ธฐ ์ ์ ๋ฐ์ดํฐ๋ฅผ UTF-8๋ก ์ธ์ฝ๋ฉํ๊ธฐ๋ฅผ ์ํฉ๋๋ค. ์ด๊ฒ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋ ๋ชจ๋ ๋ผ์ธ(์ด ๊ฒฝ์ฐ salesforce/api.py
545๋ฒ ๋ผ์ธ)์ด ๋ค์๊ณผ ๊ฐ์ด ์ฝ์ด์ผ ํจ์ ์๋ฏธํฉ๋๋ค.
response = requests.post(self.apex_url, soap_body.encode('utf-8'), verify=False, headers=headers)
๋ด ์ง๋จ์ ํ์ธํ๋ ค๋ ๋ค๋ฅธ ์ฌ๋์ ์ํด ๋ค์์ ๋ฌธ์ ๋ฅผ ํ์ธํ๋ ๊ฐ๋จํ ์ํ ์ฝ๋์ ๋๋ค.
a = "\u13E0\u19E0\u1320"
a.encode('latin1') # Throws UnicodeEncodeError, proves that this can't be expressed in ISO-8859-1.
a.encode('utf-8') # Totally fine.
r = requests.post('http://httpbin.org/post', data=a) # Using unicode string, throws UnicodeEncodeError blaming Latin1.
r = requests.post('http://httpbin.org/post', data=a.encode('utf-8')) # Works fine.
์ด ๋ฌธ์ ๋ฅผ ์ ๊ธฐํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ํ์ง๋ง ์ด๊ฒ์ ์์ฒญ ๋ฒ๊ทธ๊ฐ ์๋๋๋ค. =)
๊ฐ์ฌ ํด์.
r = requests.post(' http://httpbin.org/post ', data=a.encode('utf-8'))
๋งค์ฐ ์ ์ฉํ,
๊ฐ์ฌ ํด์!
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ฐ๋ผ์ ST 3์ด์ง๋ง ๊ฐ์ฅ ์ต๊ทผ์ ๊ฐ์ ํ์ ์๋๋๋ค. ์ข์, ๊ทธ๊ฒ์ ์ฐ๋ฆฌ์๊ฒ ๋ญ๊ฐ๋ฅผ ์ค๋ค. ํนํ Sublime Text 3๋ Python 2.7(Sublime Text 2์์ ์ฌ์ฉ)์ด ์๋ Python 3.3์ ์ฌ์ฉํฉ๋๋ค. ์ฆ, Sublime Apex์ ๋ชจ๋ ๊ธฐ๋ณธ ๋ฌธ์์ด์ ์ ๋์ฝ๋ ๋ฌธ์์ด์ ๋๋ค.
Python 3.3
http.client
ํ์ผ์ ์ด๋ฉด_send_request()
ํจ์๊ฐ ๋ค์๊ณผ ๊ฐ์ด ํ์๋ฉ๋๋ค.์ด์ ISO-8859-1์ ์ฐ๋ฆฌ๊ฐ ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ์๋ ์ฝ๋ฑ์ธ Latin-1์ ๋ณ์นญ์ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง ๋ฌธ์ ๋ Sublime Apex๊ฐ ์์ฒญ์ ์ ๋์ฝ๋ ๋ฌธ์์ด ๋ณธ๋ฌธ์ ์ ๊ณตํ๊ณ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ด ๋ณธ๋ฌธ์ httplib๊ฐ ๋ฐ์ดํธ๋ก ์ธ์ฝ๋ฉํด์ผ ํฉ๋๋ค. RFC 2616์ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํ๋ฉด ํ์๋ฅผ ํฌํจํ์ง ์๋ Latin-1์ ์ํ๋ค๋ ๊ฒฐ๋ก ์ด ๋์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ถ๋ช ํ ์ธ์ฝ๋ฉ์ด ์คํจํ๊ณ ๋ฌธ์ ์ ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
Sublime Apex๊ฐ ๋ณด๋ด๋ ํค๋์์ UTF-8 ์ธ์ฝ๋ฉ ๋ฐ์ดํฐ(ํ์ฌ๋ ๊ฑฐ์ง๋ง์)๋ฅผ ์ ์กํ๋ค๊ณ ์ฃผ์ฅํ๋ค๋ ์ ์ ๊ณ ๋ คํ๋ฉด Sublime Apex๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๊ธฐ ์ ์ ๋ฐ์ดํฐ๋ฅผ UTF-8๋ก ์ธ์ฝ๋ฉํ๊ธฐ๋ฅผ ์ํฉ๋๋ค. ์ด๊ฒ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋ ๋ชจ๋ ๋ผ์ธ(์ด ๊ฒฝ์ฐ
salesforce/api.py
545๋ฒ ๋ผ์ธ)์ด ๋ค์๊ณผ ๊ฐ์ด ์ฝ์ด์ผ ํจ์ ์๋ฏธํฉ๋๋ค.๋ด ์ง๋จ์ ํ์ธํ๋ ค๋ ๋ค๋ฅธ ์ฌ๋์ ์ํด ๋ค์์ ๋ฌธ์ ๋ฅผ ํ์ธํ๋ ๊ฐ๋จํ ์ํ ์ฝ๋์ ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ์ ๊ธฐํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ํ์ง๋ง ์ด๊ฒ์ ์์ฒญ ๋ฒ๊ทธ๊ฐ ์๋๋๋ค. =)