유니 코드 문자열을 Python의 문자열로 변환 (추가 기호 포함)


503

£ $와 같은 추가 문자가 포함 된 유니 코드 문자열을 파이썬 문자열로 어떻게 변환합니까?


2
사용중인 Python 버전과 유니 코드 문자열을 호출하는 것이 무엇인지 알아야합니다. 귀찮게하는 통화 기호를 포함하는 짧은 unicode_string에서 다음을 수행하십시오. Python 2.x : print type(unicode_string), repr(unicode_string)Python 3.x : print type(unicode_string), ascii(unicode_string)그런 다음 질문을 편집하고 위의 인쇄 문의 결과를 복사 / 붙여 넣기하십시오. 결과를 다시 입력하지 마십시오. 또한 HTML의 상단에 찾아보고이 같은 것을 찾을 수 있는지 확인 : <META HTTP-EQUIV = "Content-Type을"내용 = "text / html과; 문자셋 = 이소 - 8859
존 머신

3
나는 당신이 웹 요청에서 유니 코드를 얻는 것을 의심합니다. probalby는 UTF-8로 인코딩 된 유니 코드를 얻습니다.

28
@lutz : "UTF-8로 인코딩 된 유니 코드"가 정확히 유니 코드가 아닌 것은?
jalf

2
유니 코드 문자열파이썬 문자열 (구체적인 예제를 제공하는 것이 가장 좋을 것입니다) 이 의미하는 바를 명확하게 설명해야합니다. 댓글에서 질문에 대한 다른 해석이 있음이 분명합니다. 이 질문을 한 지 3,5 년이 지났는데 왜 그렇게하지 않았는지 궁금합니다.
Piotr Dobrogost 2012 년

6
@jalf : 인코딩 된 경우 ; 더 이상 유니 코드가 아닙니다.unicode_string = u"I'm unicode string"; bytestring = unicode_string.encode('utf-8'); unicode_again = bytestring.decode('utf-8')
jfs

답변:


572

보다 unicodedata.normalize

title = u"Klüft skräms inför på fédéral électoral große"
import unicodedata
unicodedata.normalize('NFKD', title).encode('ascii', 'ignore')
'Kluft skrams infor pa federal electoral groe'

24
+1은 단어에 따라 @reporttroup의 파일에 유니 코드를 저장할 수 없다는 문제에 대한 답을 얻습니다. 별도의 질문에 해당하는 완전히 다른 문제처럼 들립니다
Mark Roddy

5
@John-그 대답은 OP의 설명보다 앞선 것입니다.
Dominic Rodger

10
@ Mark Roddy : 작성된 질문은 일부 통화 기호가 포함 된 "유니 코드 문자열"(그것이 의미하는 바)을 "Python 문자열"(어떤 것이 든)로 변환하는 방법입니다. ASCII 이외의 문자를 삭제하면 kludge가 자신의 질문에 대답합니까 ???
John Machin

13
@JohnMachin 다음은 단어에 대한 질문에 대한 답변입니다. 문자열을 a 로 변환하는 유일한 방법 은 ASCII로 표현할 수없는 문자를 삭제하거나 변환하는 것입니다. 나에게서 +1. unicodestr
이즈 카타

4
@ lzkata : 아니, 그렇지 않습니다. type(title) == unicode and type(title.encode('utf-8')) == str. 파일에 저장할 수있는 바이트 스트링을 얻기 위해 입력을 손상시킬 필요가 없습니다.
jfs

318

비 ASCII 문자를 변환 할 필요가없는 경우 encode를 ASCII로 사용할 수 있습니다.

>>> a=u"aaaàçççñññ"
>>> type(a)
<type 'unicode'>
>>> a.encode('ascii','ignore')
'aaa'
>>> a.encode('ascii','replace')
'aaa???????'
>>>

4
멋진 답변입니다. 정확히 내가 필요한 것. 또한, 훌륭한 프리젠 테이션의 효과를 보여 ignorereplace
조니 브룩스

또는 a.encode('ascii', 'xmlcharrefreplace')제공합니다 'aaa&#224;&#231;&#231;&#231;&#241;&#241;&#241;'.
Bob Stein

type(a)이다 str파이썬 3.6.8에 어떤없는 encode()방법을.
Ali Tou

138
>>> text=u'abcd'
>>> str(text)
'abcd'

문자열에 ASCII 문자 만 포함 된 경우


18
이것은 Windows에서만 작동합니다. ASCII가 아닌 기호가 있으면 중단됩니다.
Vanuan

6
문자열의 내용이 실제로 유니 코드 문자열의 ASCII 문자가 아닌 유니 코드 인 경우 중단됩니다. 이 작업을 수행하지 않으면 모든 곳에서 임의의 UnicodeEncodeError 예외가 발생합니다.
Doug

11
이 답변이 도움이되었습니다. 문자열이 ASCII임을 알고 유니 코드가 아닌 문자열로 다시 캐스팅해야하는 경우 매우 유용합니다.
VedTopkar

113

유니 코드 문자열이 있고이를 파일 또는 다른 직렬화 된 양식에 쓰려면 먼저 저장할 수있는 특정 표현으로 인코딩 해야합니다 . UTF-16 (대부분의 유니 코드 문자에 2 바이트 사용) 또는 UTF-8 (문자에 따라 1-4 바이트 / 코드 포인트) 등과 같은 몇 가지 일반적인 유니 코드 인코딩이 있습니다. 해당 문자열을 특정 인코딩으로 변환하려면 사용할 수 있습니다 :

>>> s= u'£10'
>>> s.encode('utf8')
'\xc2\x9c10'
>>> s.encode('utf16')
'\xff\xfe\x9c\x001\x000\x00'

이 원시 바이트 문자열을 파일에 쓸 수 있습니다. 그러나 다시 읽을 때는 인코딩이 무엇인지 알고 동일한 인코딩을 사용하여 디코딩해야합니다.

파일에 쓸 때 코덱 모듈 을 사용하여이 수동 인코딩 / 디코딩 프로세스를 제거 할 수 있습니다 . 따라서 모든 유니 코드 문자열을 UTF-8 로 인코딩하는 파일을 열려면 다음을 사용하십시오.

import codecs
f = codecs.open('path/to/file.txt','w','utf8')
f.write(my_unicode_string)  # Stored on disk as UTF-8

이러한 파일을 사용하는 다른 파일은 파일을 읽으려면 파일의 인코딩을 이해해야합니다. 당신이 읽기 / 쓰기를하는 유일한 사람이라면 이것이 문제가되지 않습니다. 그렇지 않으면 다른 파일을 사용하는 사람이 이해할 수있는 형태로 작성해야합니다.

Python 3에서는 이러한 형식의 파일 액세스가 기본값이며 내장 open함수는 인코딩 매개 변수를 사용하고 텍스트 모드에서 열린 파일에 대해 항상 유니 코드 문자열 (Python 3의 기본 문자열 객체)로 /로부터 변환합니다.


58

예를 들면 다음과 같습니다.

>>> u = u'€€€'
>>> s = u.encode('utf8')
>>> s
'\xe2\x82\xac\xe2\x82\xac\xe2\x82\xac'

1
utf8여기에 표시된 것처럼 유로 기호를 인코딩 할 때 결과가 물음표 일뿐 인 이유를 누구나 설명 할 수 있습니까 ? 다음은 Python 버전 2.7.13 의 이미지 입니다. ( u"Klüft"유로는 유로 와 같은 다른 유니 코드 객체를 인코딩 할 수 있습니까?)
The Red Pea

5

글쎄, 파이썬 3으로 기꺼이 전환 할 준비가 되었다면 (파이썬 2 코드와 역 호환되지 않기 때문에) 변환 할 필요는 없다. Python 3의 모든 텍스트는 유니 코드 문자열로 표시되며 u'<text>'구문을 더 이상 사용하지 않습니다 . 또한 데이터를 나타내는 데 사용되는 바이트 문자열도 있습니다 (인코딩 된 문자열 일 수 있음).

http://docs.python.org/3.1/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit

(물론, 현재 Python 3을 사용하고 있다면 문제는 텍스트를 파일에 저장하려는 방법과 관련이 있습니다.)


2
파이썬에서 3 문자열은 유니 코드 문자열입니다. 그들은 인코딩되지 않습니다. 다음 텍스트가 유용하다는 것을 알았습니다. joelonsoftware.com/articles/Unicode.html

그는 파일에 파일을 저장하려고합니다. 당신의 대답은 어떻게 도움이 되나요?
John Machin

@ lutz : 맞습니다. 유니 코드는 인코딩이 아닌 문자 맵이라는 것을 잊었습니다. @ 존 : 현재 저장하는 문제가 무엇인지 알 수있는 충분한 정보가 없습니다. 그는 오류가 발생합니까? 그는 오류가 발생하지 않지만 외부에서 파일을 열 때 mojibake를 얻습니까? 이 정보가 없으면 제공 할 수있는 솔루션이 너무 많습니다.
JAB

@ 고양이 : 현재 자신의 저축 문제가 무엇인지는 물론 자신이 무엇을 가지고 있는지 알 수있는 정보가 없습니다. 나는 그에게 몇 가지 사실을 제시해달라고 요청했다.
John Machin

5

다음은 예제 코드입니다

import unicodedata    
raw_text = u"here $%6757 dfgdfg"
convert_text = unicodedata.normalize('NFKD', raw_text).encode('ascii','ignore')

이 답변이 허용되는 답변과 어떻게 다른가요?
sgauri

3

유니 코드를 사용하지 않는 문자열을 포함하는 파일

\"message\": \"\\u0410\\u0432\\u0442\\u043e\\u0437\\u0430\\u0446\\u0438\\u044f .....\",

나를 위해

 f = open("56ad62-json.log", encoding="utf-8")
 qq=f.readline() 

 print(qq)                          
 {"log":\"message\": \"\\u0410\\u0432\\u0442\\u043e\\u0440\\u0438\\u0437\\u0430\\u0446\\u0438\\u044f \\u043f\\u043e\\u043b\\u044c\\u0437\\u043e\\u0432\\u0430\\u0442\\u0435\\u043b\\u044f\"}

(qq.encode().decode("unicode-escape").encode().decode("unicode-escape")) 
# '{"log":"message": "Авторизация пользователя"}\n'

2
그것은 내가 사용하는 경우에도 작동했습니다 :result.encode().decode('unicode-escape')
Ammad Khalid

0

유니 코드 문자가 포함 된 문자열 변수가 있고 여기에 설명 된 인코딩 디코딩이없는 경우 내 대답에는 효과가 없었습니다.

터미널에서하면

echo "no me llama mucho la atenci\u00f3n"

또는

python3
>>> print("no me llama mucho la atenci\u00f3n")

출력이 정확합니다 :

output: no me llama mucho la atención

그러나이 문자열 변수를로드하는 스크립트 작업은 작동하지 않았습니다.

이것은 누군가를 돕기 위해 제 경우에 효과가 있었던 것입니다 .

string_to_convert = "no me llama mucho la atenci\u00f3n"
print(json.dumps(json.loads(r'"%s"' % string_to_convert), ensure_ascii=False))
output: no me llama mucho la atención

당신은 수입 JSON 필요
pctripsesp
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.