2010-03-25 5 views
1

나는이스칸디나비아 문자가있는 UTF 문자열을 ASCII로 변환하는 방법은 무엇입니까?

foo_ascii = 'nästy chäräctörs with å and co.' # ASCII 

에이 문자열을

foo_utf = u'nästy chäräctörs with å and co.' # unicode 

를 변환하고 싶습니다.

파이썬 (2.6)에서이 작업을 수행하는 방법에 대해 알고 싶습니다. unicodedata 모듈을 찾았지만 변환 방법을 모릅니다.

+8

아스키에는 å ä ö 및 기타가 없습니다. 다른 것을 원하십니까? iso 8859-1 (latin-1) 또는 utf-8? – nos

+0

아마도 조금 질문을 다시 정리해야합니다. Django 용 템플릿 태그를 개발하는 동안 문제가 발생했습니다. 정상적인 문자열을 사용할 때는 잘 작동하지만 정확히 동일한 유니 코드 문자열을 사용하는 동안 실패합니다. –

+1

맨 위 문자열은 UTF 형식이 아닙니다. UTF는 유니 코드 인코딩이며, 이는 유니 코드 문자를 나타내는 일련의 바이트임을 의미합니다. 가지고있는 것은 유니 코드 문자열로, 문자 시퀀스입니다. 각각의 바이트 수는 무의미하며 파이썬에서 결정하는 것은 불가능합니다. 구별은 단순한 보행이 아닙니다. 파이썬이 텍스트로 무엇을하는지 이해하면 이러한 유니 코드 {En, De} codeError's를 피할 수 있습니다. – jcdyer

답변

2

이것은 정말로 장고 질문이며 파이썬이 아닙니다. 문자열이 평 파일 중 하나에있는 경우, 당신은 파일의 상단에 다음 행이 있는지 확인 : 또한, 귀하의 문자열 유형 "유니 코드"의 할 필요가 -*- coding: utf-8 -*-

(u'foobar ') 다음

그리고 당신의 HTML 페이지가 유니 코드에서 작동하는지 확인 : 전체 트릭을 할해야

<meta http-equiv="content-type" content="text/html;charset=utf-8" />

. 인코딩/디코딩 등은 필요하지 않습니다. 모든 것이 유니 코드인지, 당신이 안전한쪽으로 있는지 확인하십시오.

+0

우수한 포인터 주셔서 감사. 나는 그 문제를 코드에서 분리하여 str 변환으로 추적 할 수 있었다. 나는 다른 의견도 통찰력있는 것으로 발견했다. :) –

+0

실제로 파일을 utf-8로 저장하면 코딩 선언과 일치하게됩니다. –

3

문자열의 encode 메서드를 사용해보십시오.

>>> u'nästy chäräctörs with å and co.'.encode('latin-1') 
'n\xe4sty ch\xe4r\xe4ct\xf6rs with \xe5 and co.' 
4

나는 그렇게 생각하지 않습니다. 이러한 "nästy chäräctörs"는 ASCII로 인코딩 할 수 없으므로 다른 인코딩 (UTF-8 또는 Latin-1 또는 Windows-1252 또는 기타)을 선택해야합니다.

+0

사실입니다. ASCII는 127 자만 포함하고 분음 기호는 없습니다. 올바른 코드 페이지를 선택하면 ANSI로 변환 할 수 있습니다.어쨌든 다른 선택의 여지가 없다면 유니 코드를 고수하는 것이 가장 좋습니다. –

+0

감사합니다. 그건 좋은 지적이야. 나는 그것에 대해 완전히 잊었다. :) –

2

파이썬에서 제공되는 unicodedata 모듈 (http://docs.python.org/library/unicodedata.html)을 사용하여 많은 유니 코드 값을 Ascii 변형으로 변환 할 수도 있습니다. IE는 다른 것들을 고쳐 쓰고 encode() 메소드를 따라 가면 문자열을 완전히 정리할 수 있습니다.

유니 코드 된 데이터의 대부분을 정상화하고 NFKC 플래그를 전달하는 방법은

입니다.
3

파이썬의 다음 stdlib에서 codecs 모듈의 여러 옵션을 사용하면 확장 된 문자가 처리 방법에 따라,이 있습니다. 그 중

>>> import codecs 
>>> u = u'nästy chäräctörs with å and co.' 
>>> encode = codecs.get_encoder('ascii') 
>>> encode(u) 
' 
Traceback (most recent call last): 
    File "<stdin>", line 1, in ? 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 1: ordinal not in range(128) 
>>> encode(u, 'ignore') 
('nsty chrctrs with and co.', 31) 
>>> encode(u, 'replace') 
('n?sty ch?r?ct?rs with ? and co.', 31) 
>>> encode(u, 'xmlcharrefreplace') 
('n&#228;sty ch&#228;r&#228;ct&#246;rs with &#229; and co.', 31) 
>>> encode(u, 'backslashreplace') 
('n\\xe4sty ch\\xe4r\\xe4ct\\xf6rs with \\xe5 and co.', 31) 

희망 한 요구를 충족 할 Python codecs module documentation에서 사용할 수있는 더 많은 정보가있다

.