텍스트 파일에 유니코드 텍스트를 쓰는 중?
나는 구글 문서에서 데이터를 꺼내서 그것을 처리하고 파일에 쓰고 있다(결국 워드프레스 페이지에 붙여넣을 것이다).
비 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에서 이미 표준화되어 있다.
- 문자가 이미 메모리에 유니코드(32비트)에 저장되어 있음
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
모듈(이것은 기본 제공과 동일함)open
Python 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진수 매핑, 범주, 기호(이름을 얻을 수 없는 경우, 따라서 아마도 제어 문자) 및 기호 이름(예:
추천한다less
Unix 또는 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.encode
str
활자)
보통을 사용해야 한다.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 문자열을 사용한다고 가정하여 해독하려고 할 때 발생한다.두 가지 가능성이 있다.
- 당신은 그것을 bytestring에 인코딩하고 있지만, 당신이 코덱s.open을 사용했기 때문에, 쓰기 방법은 유니코드 객체를 기대한다.그래서 인코딩을 하면 다시 해독을 시도한다.시도:
f.write(all_html)
대신에 - 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
'Programing' 카테고리의 다른 글
왜 구성요소에 Axios나 HTTP 호출을 사용하는 것이 좋지 않은 관행으로 여겨지는가? (0) | 2022.03.07 |
---|---|
v-메뉴 구성 요소가 표시되지 않음 (0) | 2022.03.07 |
외부 JS 스크립트를 VueJS 구성 요소에 추가하는 방법 (0) | 2022.03.07 |
v-for 루프 및 키 속성 사용 (0) | 2022.03.07 |
vue.js 렌더 함수의 단추에 이벤트 수신기 추가 (0) | 2022.03.07 |