파이썬에서 유니코드

snowall의 이미지

윈도우즈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) 

이라고 뜹니다.

간단한 문제같아 보이는데 파이썬 경력이 짧다보니 검색해도 답도 못찾겠고 해서 혹시 아시는 분의 조언을 구합니다. 감사합니다. :)

cleansugar의 이미지

filename.encode('utf-8') 인가요?

파이썬 마을에도 물어보세요.

재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.

아이디의 아이디어 무한도전
http://blog.aaidee.com

귀태닷컴
http://www.gwitae.com

snowall의 이미지

그럼 입력은 되는데 한글이 다 깨져버리면서 지정한 경로를 찾아가지 못합니다. -_-; 난감하죠.

파이썬 마을에도 물어봐야겠네요

피할 수 있을때 즐겨라! http://melotopia.net/b

kwchun의 이미지

어제오늘 파이썬 마을 접속이 안 되네요. '다음'으로 넘어가 버리던데요. 요즘 종종 접속이 안 되던데, 서버 운영에 무슨 문제가 있을까요?

cleansugar의 이미지

재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.

아이디의 아이디어 무한도전
http://blog.aaidee.com

귀태닷컴
http://www.gwitae.com

kwchun의 이미지

인코딩을 지정해주면 됩니다. 제가 윈도를 사용하지 않아서 확인은 못 해봤지만, 아래 두 줄 중 하나를 파일 첫 줄에 넣어보세요.

# -*- coding: utf-8 -*-

# -*- coding: cp949 -*-
snowall의 이미지

그러나 확인해보니 둘 다 안됩니다. 어떻게 해봐도 같은 에러가 나네요. euc-kr도 넣어보았습니다.

분명 인코딩 관련 문제이긴 한데, 파이썬x윈도우즈 조합에서는 한글 경로명을 사용하지 못하는 것일까요?

피할 수 있을때 즐겨라! http://melotopia.net/b

익명 사용자의 이미지

reload(sys)
sys.setdefaultencoding('utf-8')

snowall의 이미지

한글 부분이 깨지면서 불러오지 못하게 됩니다.

utf-8대신에 cp949를 썼더니 뭔가 되기는 하는데, convert프로그램이 에러를 보여주네요.

아무튼 이렇게 해봐야겠네요 감사합니다.

피할 수 있을때 즐겨라! http://melotopia.net/b

송효진의 이미지

raymundo의 이미지

음... 제가 파이썬에서는 어떻게 하는지 전혀 모르겠는데, 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 로 인코딩된 바이트 시퀀스가 아니라) 그러니 일단 정말 그렇게 들어가 있는지를 확인해보면 어떨까요.

다시 한 번 말씀드리지만 파이썬은 잘 몰라서 ^^; 참고만 하십사...

좋은 하루 되세요!

qiiiiiiiip의 이미지

# -*- coding: cp949 -*-

는 소스코드내에 한글이 포함되어있는 경우,
그 인코딩을 지정하는 내용입니다.

unicode, encode, decode 를 적당히 섞어서 사용하시면 될 것 같습니다.

저는 windows환경이 아니라 직접 해볼 수는 없지만

	os.system("convert \"" + filename + "\" \"" + filename + ".txt\"")

에서 filename의 인코딩에 따라서,

cmd = 'convert "%s" "%s.txt"' %( unicode( filename, 'utf8' ), unicode( filename, 'utf8' ) )
os.system( cmd.encode( 'cp949' ) )

와 같이 하시면 될 것 같습니다.

cleansugar의 이미지

윈도우에서의 파이썬 유니코드 한글 처리 문제
http://coreapython.hosting.paran.com/etc/hangulpython.htm

재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.

아이디의 아이디어 무한도전
http://blog.aaidee.com

귀태닷컴
http://www.gwitae.com

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.