์๋
ํ์ธ์,
๋ณ์ s ๋ฅผ ๋ค๋ฅธ ๊ฐ u '\ xff'๋ก ๋ฐ๊พธ๋ฉด ์ด ํ
์คํธ๋ ์คํจํฉ๋๋ค.
[ํ ์คํธ ์ผ์ด์ค]
@mock_streams('stdout')
def test_puts_with_encoding_type_none_output():
"""
puts() should print unicode output without a stream encoding
"""
s = u"string!" #<====== replace to u"\xff"
output.user = True
sys.stdout.encoding = None
puts(s, show_prefix=False)
eq_(sys.stdout.getvalue(), s + "\n")
[์ญ ์ถ์ ]
UnicodeEncodeError : 'ascii'์ฝ๋ฑ์ ์์น 0-4์ ๋ฌธ์๋ฅผ ์ธ์ฝ๋ฉ ํ ์ ์์ต๋๋ค. ์ ์๊ฐ ๋ฒ์์ ์์ต๋๋ค (128).
[์ฝ๋ฉํธ]
๋ฒ๊ทธ๊ฐ์๋ ์ง์ ์ utils.py์ '_encode'ํจ์์ ์์ต๋๋ค. str (msg)์ ์ฌ์ฉํ์ฌ ๋จ์ํ msg๋ฅผ str๋ก ์บ์คํธํด์๋ ์๋ฉ๋๋ค.
def _encode(msg, stream):
if isinstance(msg, unicode) and hasattr(stream, 'encoding') and not stream.encoding is None:
return msg.encode(stream.encoding)
else:
return str(msg) #<========== buggy point
๋๊ตฌ ์ ๊ฒฝ ์ฐ๋์?
์, return str(msg)
๋ฅผ return msg
ํ๋ฉด ํ
์คํธ๋ฅผ ์ค๋จํ์ง ์๊ณ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋ ๊ฒ ๊ฐ์ต๋๋ค. ํ์ง๋ง์ด ์บ์คํธ๊ฐ ์ฒ์์ ํ์ํ ์ด์ ๋ ๋ฌด์์
๋๊น?
๋๋ ์ด๊ฒ์ ์ง๊ธ ๋ฐ๊พธ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ํ์ ํ์ง ์์ต๋๋ค. ์ ๋์ ์ผ๋ก ๋ค๋ฅธ ์ฌ๋์ ์ฝ๋๋ฅผ ๊นจ๋จ๋ฆฌ์ง๋ ์์ ๊ฒ์ด์ง๋ง, ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฌธ์์ด์ด ์๋ puts
๊ฒ์ ํ์ฉํ๊ณ ํ๋ช
ํ ๊ฒ์ ์ป์ ์ ์์ต๋๋ค.
>>> class Foo(object):
... def __str__(self): return "The best Foo in the world"
...
>>> from fabric.api import puts
>>> puts(Foo())
The best Foo in the world
๋๋ ์ด๊ฒ์ ์ฌ์ฉํ๋ ์ฝ๋๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค (github์์ ์ด๊ฒ์ ๊ฒ์ํ๋ ๊ฒ์ด ํฌ๋ง์ด ์์ผ๋ฏ๋ก ์์ ๋ฅผ ์ฐพ์ผ๋ ค๊ณ ํ์ง ์์ ๊ฒ์ ๋๋ค).
ํ์ง๋ง ์ธ์ฝ๋ฉ ์ธํธ๊ฐ์๊ณ ์ ๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ฉด puts
๊ฐ ์ฐ๋ฆฌ๋ฅผ ์ถฉ๋์ํค๋ ๊ฒ์ด ์ณ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
ํ์ฌ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฐ์ฅ ์ต์ ์ ๋ฐฉ๋ฒ์ ๋ฌธ์ ๊ฐ๋๋ ์ค์์ด ๋ธ๋ก์ผ๋ก ํ์ฅํ๋ ๊ฒ์ ๋๋ค.
try:
return str(msg) # Original behavior added for 'reasons'
except UnicodeDecodeError:
return msg # Best-effort fallback
์ด๋ฐ ์์ผ๋ก ์ฐ๋ฆฌ๊ฐ ํ์ผ๋ก ์บ์คํธํ๋ ๋ฐ ๋ํ ์ ์กฐ์ ์ธ ์ด์ ๊ฐ ๋ฌด์์ด๋ ๊ฐ์ ๊ณ์ ์๋ํ์ง๋ง ๋
ผ์์ค์ธ ๋ฒ๊ทธ๊ฐ์๋ ๊ฒฝ์ฐ๋ "๊ธ์,์ด๊ฒ ๋ญ์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง str()
ํ ์ ์์ต๋๋ค ์ด๋ฏ๋ก ๊ทธ๋๋ก ํ์ดํ ์๋๋ก ๋ฐ์ด ๋ฃ์ต๋๋ค. "
sudo
๋ฉ์๋๋ฅผ ์คํํ๋ ๋์ ๋น์ทํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ผ๋ฉฐ io.py
self.stream.write(text)
์์ ์์ธ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์ ๋ ์ฝ๋ ๋ฌธ์ ์ ๋ํ ์ง์ ์ด ์์ต๋๊น?
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋๊ตฌ ์ ๊ฒฝ ์ฐ๋์?