문제

텍스트 파일에는 문자열이 "나는 이것을 좋아하지 않는다"는 문자열이있다.

그러나 문자열로 읽을 때 "I Don xe2 x80 x98t가 이렇게합니다"가됩니다. u2018은 " '"의 유니 코드 표현이라는 것을 이해합니다. 나는 사용한다

f1 = open (file1, "r")
text = f1.read()

독서를하도록 명령.

자, 문자열이 문자열에 읽을 때 "나는 이것을 좋아하지 않는다"는 "이렇게하지 않는다"대신 "나는 이것을 좋아하지 않는다"고 문자열을 읽을 수 있습니까?

두 번째 편집 : 일부 사람들 이이 문제를 해결하기 위해 매핑을 사용하는 것을 보았지만 실제로 이러한 종류의 ANSI가 유니 코드 (및 그 반대)로 변환하는 내장 변환이 없습니까?

도움이 되었습니까?

해결책

ref : http://docs.python.org/howto/unicode

따라서 파일에서 유니 코드를 읽는 것이 간단합니다.

import codecs
f = codecs.open('unicode.rst', encoding='utf-8')
for line in f:
    print repr(line)

업데이트 모드에서 파일을 열면 읽기와 쓰기를 모두 허용 할 수도 있습니다.

f = codecs.open('test', encoding='utf-8', mode='w+')
f.write(u'\u4500 blah blah blah\n')
f.seek(0)
print repr(f.readline()[:1])
f.close()

편집하다: 나는 당신의 의도 된 목표가 파이썬의 문자열로 파일을 올바르게 읽을 수 있다고 가정합니다. 유니 코드에서 ASCII 문자열로 변환하려는 경우 유니 코드 문자가 반드시 ASCII에 존재하지 않기 때문에 직접적인 방법이 없습니다.

ASCII 문자열로 변환하려는 경우 다음 중 하나를 사용해보십시오.

  1. 이 특정 예제와 같은 몇 가지 특별한 경우 만 처리하려는 경우 특정 유니 코드 숯을 ASCII 동등 물로 교체하십시오.

  2. 사용 unicodedata 모듈 normalize() 그리고 string.encode() 최선을 다하면 다음으로 가장 가까운 ASCII 동등한 것으로 변환하는 방법 (Ref https://web.archive.org/web/20090228203858/http://techxplorer.com/2006/07/18/converting-unicode-to-ascii-using-python):

    >>> teststr
    u'I don\xe2\x80\x98t like this'
    >>> unicodedata.normalize('NFKD', teststr).encode('ascii', 'ignore')
    'I donat like this'
    

다른 팁

고려해야 할 몇 가지 사항이 있습니다.

u2018 문자는 파이썬에서 유니 코드 문자열의 표현 조각으로 만 나타날 수 있습니다.

>>> text = u'‘'
>>> print repr(text)
u'\u2018'

이제 단순히 유니 코드 문자열을 예쁘게 인쇄하려면 유니 코드를 사용하십시오. encode 방법:

>>> text = u'I don\u2018t like this'
>>> print text.encode('utf-8')
I don‘t like this

파일의 모든 라인이 유니 코드로 읽을 수 있도록 codecs.open 단지 기능 open, 파일 인코딩을 지정할 수 있습니다.

>>> import codecs
>>> f1 = codecs.open(file1, "r", "utf-8")
>>> text = f1.read()
>>> print type(text)
<type 'unicode'>
>>> print text.encode('utf-8')
I don‘t like this

그러나 그것은 실제로 "나는 이것처럼"이렇게 "나는 이것을 좋아하지 않는다"는 것이 아닙니다. 캐릭터 u ' u2018'은 " '"와 완전히 다른 캐릭터입니다 (시각적으로는'` '에 더 해당해야합니다).

인코딩 된 유니 코드를 일반 ASCII로 변환하려는 경우 ASCII로 변환하려는 유니 코드 구두점 매핑을 유지할 수 있습니다.

punctuation = {
  u'\u2018': "'",
  u'\u2019': "'",
}
for src, dest in punctuation.iteritems():
  text = text.replace(src, dest)

끔찍한 많은 것들이 있습니다 유니 코드의 구두점 문자, 그러나, 나는 당신이 읽고있는 문서를 작성하는 응용 프로그램에서 실제로 사용되는 몇 가지만 믿을 수 있다고 생각합니다.

텍스트 파일이 끊어 졌다는 사실을 제외하고 (U+2018은 아포스트로피가 아닌 왼쪽 따옴표입니다) ICONV를 사용하여 유니 코드 문자를 ASCII로 변환 할 수 있습니다.

모듈이 더 이상 지원되지 않는 것처럼 보이고 정식 홈페이지를 찾을 수 없으므로 "iconvcodec"을 위해 Google에 대한 Google이 필요합니다.

>>> import iconvcodec
>>> from locale import setlocale, LC_ALL
>>> setlocale(LC_ALL, '')
>>> u'\u2018'.encode('ascii//translit')
"'"

또는 사용할 수 있습니다 iconv 명령 줄 유틸리티 파일 정리 :

$ xxd foo
0000000: e280 980a                                ....
$ iconv -t 'ascii//translit' foo | xxd
0000000: 270a                                     '.

어떻게 든 유니 코드 이스케이프 문자가있는 비 노니 코드 문자열이있을 가능성이 있습니다.

>>> print repr(text)
'I don\\u2018t like this'

이것은 실제로 한 번 전에 나에게 일어났습니다. 당신은 a를 사용할 수 있습니다 unicode_escape 문자열을 유니 코드로 디코딩 한 다음 원하는 형식으로 인코딩하는 코덱.

>>> uni = text.decode('unicode_escape')
>>> print type(uni)
<type 'unicode'>
>>> print uni.encode('utf-8')
I don‘t like this

이것은 파이썬 방법으로 유니 코드 인코딩 문자열을 보여줍니다. 그러나 화면에 문자열을 인쇄하거나 문제없이 새 파일에 쓸 수 있어야한다고 생각합니다.

>>> test = u"I don\u2018t like this"
>>> test
u'I don\u2018t like this'
>>> print test
I don‘t like this

실제로 U+2018은 특수 문자의 유니 코드 표현입니다. ' 원하는 경우 해당 문자의 인스턴스를이 코드로 U+0027로 변환 할 수 있습니다.

text = text.replace (u"\u2018", "'")

또한 파일을 작성하는 데 무엇을 사용하고 있습니까? f1.read() 다음과 같이 보이는 문자열을 반환해야합니다.

'I don\xe2\x80\x98t like this'

돌아 오면 이것 문자열, 파일이 잘못 작성됩니다.

'I don\u2018t like this'

Python 3 읽기 메소드를 사용하여 인코딩 된 텍스트 파일을 읽을 수도 있습니다.

f = open (file.txt, 'r', encoding='utf-8')
text = f.read()
f.close()

이 변형으로 추가 라이브러리를 가져올 필요가 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top