Programing

텍스트 파일에 유니코드 텍스트를 쓰는 중?

c10106 2022. 3. 7. 21:22
반응형

텍스트 파일에 유니코드 텍스트를 쓰는 중?

나는 구글 문서에서 데이터를 꺼내서 그것을 처리하고 파일에 쓰고 있다(결국 워드프레스 페이지에 붙여넣을 것이다).

비 ASC가 일부 있다.II 기호.어떻게 하면 HTML 소스에서 사용할 수 있는 기호로 안전하게 변환할 수 있을까?

현재 나는 들어오는 길에 모든 것을 유니코드로 변환하여 파이톤 문자열로 결합한 다음 다음을 수행하고 있다.

import codecs
f = codecs.open('out.txt', mode="w", encoding="iso-8859-1")
f.write(all_html.encode("iso-8859-1", "replace"))

마지막 줄에 인코딩 오류가 있음:

UnicodeDecodeError: 'ascII' 코덱이 위치 12286에서 바이트 0xa0을 디코딩할 수 없음: 서수가 범위(128)에 없음

부분 솔루션:

Python은 오류 없이 실행됨:

row = [unicode(x.strip()) if x is not None else u'' for x in row]
all_html = row[0] + "<br/>" + row[1]
f = open('out.txt', 'w')
f.write(all_html.encode("utf-8"))

그러나 실제 텍스트 파일을 열면 다음과 같은 많은 기호가 나타난다.

Qur’an 

혹시 텍스트 파일 말고 다른 거 써야 하는 거 아니야?

유니코드 객체를 처음 가져올 때 유니코드 객체로 사물을 디코딩하고 나가는 길에 필요에 따라 인코딩하여 가능한 한 유니코드 객체를 독점적으로 처리하십시오.

문자열이 실제로 유니코드 개체인 경우 파일에 쓰기 전에 해당 문자열을 유니코드 인코딩 문자열 개체로 변환하십시오.

foo = u'Δ, Й, ק, ‎ م, ๗, あ, 叶, 葉, and 말.'
f = open('test', 'w')
f.write(foo.encode('utf8'))
f.close()

이 파일을 다시 읽으면 유니코드 개체로 디코딩할 수 있는 유니코드 인코딩 문자열이 나온다.

f = file('test', 'r')
print f.read().decode('utf8')

Python 2.6+에서는 Python 3에서 기본값(builtin )을 사용할 수 있다.

import io

with io.open(filename, 'w', encoding=character_encoding) as file:
    file.write(unicode_text)

문자메시지를 점진적으로 써야 하는 경우(전화할 필요 없음)가 더 편할 수도 있다.unicode_text.encode(character_encoding)여러 번와는 달리codecs모듈io모듈은 적절한 범용 뉴라인 지지대를 가지고 있다.

유니코드 문자열 처리는 파이썬 3에서 이미 표준화되어 있다.

  1. 문자가 이미 메모리에 유니코드(32비트)에 저장되어 있음
  2. utf-8에서만 파일을 열면 된다.
    (32비트 유니코드를 가변 바이트 길이 utf-8 변환은 메모리에서 파일로 자동 수행됨)

    out1 = "(嘉南大圳 ㄐㄧㄚ ㄋㄢˊ ㄉㄚˋ ㄗㄨㄣˋ )"
    fobj = open("t1.txt", "w", encoding="utf-8")
    fobj.write(out1)
    fobj.close()
    

서문: 당신의 뷰어가 통할 것인가?

뷰어/편집자/단자(그러나 utf-8로 인코딩된 파일과 상호 작용 중)가 파일을 읽을 수 있는지 확인하십시오.이는 Windows(윈도우)에서 자주 발생하는 문제(예: 메모장)이다.

텍스트 파일에 유니코드 텍스트를 쓰는 중?

에서는 파이썬 2를 open처음부터io모듈(이것은 기본 제공과 동일함)openPython 3:

import io

모범 사례, 일반적으로 사용UTF-8파일에 쓰는 것(UTF-8로 바이트 순서를 걱정할 필요 없음).

encoding = 'utf-8'

utf-8은 가장 현대적이고 보편적으로 사용할 수 있는 인코딩이다. 인코딩은 모든 웹 브라우저, 대부분의 텍스트 메시지(문제가 있는 경우 설정 참조), 대부분의 터미널/인코딩에서 작동한다.

를 사용해 볼 수 utf-16le메모장(또는 다른 제한된 뷰어)에서 출력을 볼 수 있도록 제한된 경우

encoding = 'utf-16le' # sorry, Windows users... :(

컨텍스트 관리자와 함께 열고 유니코드 문자를 작성하십시오.

with io.open(filename, 'w', encoding=encoding) as f:
    f.write(unicode_object)

여러 유니코드 문자 사용 예제

가능한 모든 문자를 최대 3비트 폭(4은 최대값이지만, 그것은 약간 멀어질 것)까지 디지털 표현(정수)에서 인코딩된 인쇄 가능 출력까지 가능하면 그 이름과 함께 매핑(이것을 파일이라는 파일에 넣는다)하는 예가 여기에 있다.uni.py):

from __future__ import print_function
import io
from unicodedata import name, category
from curses.ascii import controlnames
from collections import Counter

try: # use these if Python 2
    unicode_chr, range = unichr, xrange
except NameError: # Python 3
    unicode_chr = chr

exclude_categories = set(('Co', 'Cn'))
counts = Counter()
control_names = dict(enumerate(controlnames))
with io.open('unidata', 'w', encoding='utf-8') as f:
    for x in range((2**8)**3): 
        try:
            char = unicode_chr(x)
        except ValueError:
            continue # can't map to unicode, try next x
        cat = category(char)
        counts.update((cat,))
        if cat in exclude_categories:
            continue # get rid of noise & greatly shorten result file
        try:
            uname = name(char)
        except ValueError: # probably control character, don't use actual
            uname = control_names.get(x, '')
            f.write(u'{0:>6x} {1}    {2}\n'.format(x, cat, uname))
        else:
            f.write(u'{0:>6x} {1}  {2}  {3}\n'.format(x, cat, char, uname))
# may as well describe the types we logged.
for cat, count in counts.items():
    print('{0} chars of category, {1}'.format(count, cat))

이 작업은 약 1분 단위로 실행되어야 하며, 데이터 파일을 볼 수 있으며, 파일 뷰어가 유니코드를 표시할 수 있으면 볼 수 있다.카테고리에 대한 정보는 여기에서 찾을 수 있다.계수에 근거해, 우리는 아마도 그것과 관련된 기호가 없는 cn과 co 범주를 제외시킴으로써 결과를 개선할 수 있을 것이다.

$ python uni.py

16진수 매핑, 범주, 기호(이름을 얻을 수 없는 경우, 따라서 아마도 제어 문자) 및 기호 이름(예:

추천한다lessUnix 또는 Cygwin에서(전체 파일을 출력에 인쇄/고정하지 않음):

$ less unidata

예: Python 2(유니코드 5.2)를 사용하여 샘플링한 다음 행과 유사하게 표시됨:

     0 Cc NUL
    20 Zs     SPACE
    21 Po  !  EXCLAMATION MARK
    b6 So  ¶  PILCROW SIGN
    d0 Lu  Ð  LATIN CAPITAL LETTER ETH
   e59 Nd  ๙  THAI DIGIT NINE
  2887 So  ⢇  BRAILLE PATTERN DOTS-1238
  bc13 Lo  밓  HANGUL SYLLABLE MIH
  ffeb Sm  →  HALFWIDTH RIGHTWARDS ARROW

아나콘다에서 온 내 파이톤 3.5는 유니코드 8.0을 가지고 있어, 아마 대부분 3이 될 거야.

파일이 열림:codecs.open 것이다.unicode데이터, 인코딩iso-8859-1파일에 쓰세요그러나 쓰려고 하는 것은 그렇지 않다.unicode; 당신이 가져가세요.unicode그리고 그것을 인코딩한다.iso-8859-1 자신.그런 것이다.unicode.encodestr활자)

보통을 사용해야 한다.open()유니코드를 직접 인코딩하거나 (대개 더 나은 아이디어) 사용codecs.open()데이터를 직접 인코딩하지 마십시오.

유니코드 문자를 파일로 인쇄하는 방법:

파일에 저장: foo.py:

#!/usr/bin/python -tt
# -*- coding: utf-8 -*-
import codecs
import sys 
UTF8Writer = codecs.getwriter('utf8')
sys.stdout = UTF8Writer(sys.stdout)
print(u'e with obfuscation: é')

실행 후 출력을 파일로 파이프:

python foo.py > tmp.txt

오픈 tmp.txt를 보고 안을 들여다보면 다음과 같다.

el@apollo:~$ cat tmp.txt 
e with obfuscation: é

따라서 유니코드 e에 난독화 표시가 있는 파일을 저장했다.

이러한 오류는 비 유니코드 문자열을 인코딩하려고 할 때 발생한다. 이 문자열이 일반 ASCII 문자열을 사용한다고 가정하여 해독하려고 할 때 발생한다.두 가지 가능성이 있다.

  1. 당신은 그것을 bytestring에 인코딩하고 있지만, 당신이 코덱s.open을 사용했기 때문에, 쓰기 방법은 유니코드 객체를 기대한다.그래서 인코딩을 하면 다시 해독을 시도한다.시도:f.write(all_html)대신에
  2. all_properties는 사실 유니코드 객체가 아니다.할 때.encode(...), 그것은 먼저 그것을 해독하려고 시도한다.

python3로 쓰는 경우

>>> a = u'bats\u00E0'
>>> print a
batsà
>>> f = open("/tmp/test", "w")
>>> f.write(a)
>>> f.close()
>>> data = open("/tmp/test").read()
>>> data
'batsà'

python2로 쓰는 경우:

>>> a = u'bats\u00E0'
>>> f = open("/tmp/test", "w")
>>> f.write(a)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 4: ordinal not in range(128)

이 오류를 방지하려면 다음과 같은 코덱 "utf-8"을 사용하여 바이트로 인코딩해야 한다.

>>> f.write(a.encode("utf-8"))
>>> f.close()

코덱 "utf-8"을 사용하여 데이터를 해독하십시오.

>>> data = open("/tmp/test").read()
>>> data.decode("utf-8")
u'bats\xe0'

또한 이 문자열에서 인쇄를 실행하려고 하면 다음과 같은 "utf-8" 코덱을 사용하여 자동으로 디코딩된다.

>>> print a
batsà

참조URL: https://stackoverflow.com/questions/6048085/writing-unicode-text-to-a-text-file

반응형