파이썬에서 유니코드
글쓴이: snowall / 작성시간: 화, 2012/08/07 - 6:12오후
윈도우즈7에서 파이썬으로 뭔가를 개발중입니다.
파일 이름을 받으면 그 파일을 열어서 뭔가를 하는 루틴인데요
import os def converting(filename): os.system("convert \"" + filename + "\" \"" + filename + ".txt\"")
convert는 ImageMagick의 그 convert입니다.
일단, \"들은 filename의 중간에 빈칸이 있는 경우때문에 집어넣었습니다. 문제는 filename에 한글이 포함된 경우인데요. 실행시키면
UnicodeEncodeError: 'ascii' codec can't encode characters in position 31-34: ordinal not in range(128)
이라고 뜹니다.
간단한 문제같아 보이는데 파이썬 경력이 짧다보니 검색해도 답도 못찾겠고 해서 혹시 아시는 분의 조언을 구합니다. 감사합니다. :)
Forums:
filename.encode('utf-8') 인가요?
filename.encode('utf-8') 인가요?
파이썬 마을에도 물어보세요.
재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.
아이디의 아이디어 무한도전
http://blog.aaidee.com
귀태닷컴
http://www.gwitae.com
그럼 입력은 되는데 한글이 다 깨져버리면서 지정한
그럼 입력은 되는데 한글이 다 깨져버리면서 지정한 경로를 찾아가지 못합니다. -_-; 난감하죠.
파이썬 마을에도 물어봐야겠네요
피할 수 있을때 즐겨라! http://melotopia.net/b
어제오늘 파이썬 마을 접속이 안 되네요. 다음으로
어제오늘 파이썬 마을 접속이 안 되네요. '다음'으로 넘어가 버리던데요. 요즘 종종 접속이 안 되던데, 서버 운영에 무슨 문제가 있을까요?
http://python.kr/
http://python.kr/
재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.
아이디의 아이디어 무한도전
http://blog.aaidee.com
귀태닷컴
http://www.gwitae.com
인코딩을 지정해주면 됩니다.
인코딩을 지정해주면 됩니다. 제가 윈도를 사용하지 않아서 확인은 못 해봤지만, 아래 두 줄 중 하나를 파일 첫 줄에 넣어보세요.
그러나 확인해보니 둘 다 안됩니다. 어떻게 해봐도
그러나 확인해보니 둘 다 안됩니다. 어떻게 해봐도 같은 에러가 나네요. euc-kr도 넣어보았습니다.
분명 인코딩 관련 문제이긴 한데, 파이썬x윈도우즈 조합에서는 한글 경로명을 사용하지 못하는 것일까요?
피할 수 있을때 즐겨라! http://melotopia.net/b
reload(sys) sys.setdefaultenc
reload(sys)
sys.setdefaultencoding('utf-8')
한글 부분이 깨지면서 불러오지 못하게
한글 부분이 깨지면서 불러오지 못하게 됩니다.
utf-8대신에 cp949를 썼더니 뭔가 되기는 하는데, convert프로그램이 에러를 보여주네요.
아무튼 이렇게 해봐야겠네요 감사합니다.
피할 수 있을때 즐겨라! http://melotopia.net/b
http://www.imagemagick.org/sc
http://www.imagemagick.org/script/api.php
api 로 하면 어떨까요?
https://xenosi.de/
음... 제가 파이썬에서는 어떻게 하는지 전혀
음... 제가 파이썬에서는 어떻게 하는지 전혀 모르겠는데, Perl 에서의 경우를 적어보면, Perl 은 다음 두 가지를 구분합니다.
1) 논리적인 스트링 : UTF-8 로 구현이 되어 있긴 한데, 어쨌거나 내부구현이 중요한 게 아니라 그냥 유니코드 스트링입니다. "가나다" 이게 길이 3으로 간주되고 정규표현식에서도 "."이 한 음절에 대응되고 등등 (python 에서도 u"스트링" 이런 식으로 쓰면 유니코드 스트링이 되는 걸로 압니다만)
2) 바이트 시퀀스 : 입력으로 들어오거나 출력으로 나갈 때의 문자열을 표현한 것. 인코딩에 따라 달라지겠죠. "가나다" 이건 6바이트 또는 9바이트. "."는 1바이트에 대응.
그래서 지금같은 코드를 Perl 로 짰다면
1) 파일명이 사용자 입력 등 외부에서 raw 상태의 바이트 시퀀스로 들어온다면 - 그 파일명이 시스템의 파일시스템과 같은 인코딩이었다면 그냥 쓰면 되고 (윈도 콘솔에서라면 동일하게 cp949겠지요), 만일 입력은 UTF-8 인데 파일시스템은 cp949 라면 컨버트해줘야 하고....
2) 파일명이 소스 코드에 스트링 상수로 그냥 적힌 거라면 - 소스 코드의 인코딩이 그대로 적용되기도 하고 (소스 코드 저장을 cp949 로 했다면 이 파일명도 cp949, UTF-8이라면 UTF-8), 또는 use utf8; 이렇게 스위치를 켜주었다면 소스 코드 내의 스트링은 논리적인 스트링으로 취급되어서, 이걸 cp949 로 인코딩해줘야 실제 파일을 제대로 찾을 수 있습니다.
본문 코드를 보면 system()을 부르고 있으니, 아마 filename 에는 실제로 cp949 로 인코딩된 상태의 바이트 시퀀스가 들어가야 할 것 같습니다. (유니코드 스트링이나 UTF-8 로 인코딩된 바이트 시퀀스가 아니라) 그러니 일단 정말 그렇게 들어가 있는지를 확인해보면 어떨까요.
다시 한 번 말씀드리지만 파이썬은 잘 몰라서 ^^; 참고만 하십사...
좋은 하루 되세요!
# -*- coding: cp949 -*-는
# -*- coding: cp949 -*-
는 소스코드내에 한글이 포함되어있는 경우,
그 인코딩을 지정하는 내용입니다.
unicode, encode, decode 를 적당히 섞어서 사용하시면 될 것 같습니다.
저는 windows환경이 아니라 직접 해볼 수는 없지만
에서 filename의 인코딩에 따라서,
와 같이 하시면 될 것 같습니다.
윈도우에서의 파이썬 유니코드 한글 처리
윈도우에서의 파이썬 유니코드 한글 처리 문제
http://coreapython.hosting.paran.com/etc/hangulpython.htm
재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.
아이디의 아이디어 무한도전
http://blog.aaidee.com
귀태닷컴
http://www.gwitae.com
댓글 달기