python 학습 강좌 (3) - 문자 인코딩

4389 단어
ASCII, 유니코드와 UTF-8 간의 연계와 차이
1. ASCII
127개의 문자를 컴퓨터에 한 바이트로 컴파일하다
2. Unicode
ASCII는 영어 문자가 아니기 때문에 각 언어가 자신의 표준을 맞춤형으로 설정하여 부호화 문제가 발생한다.유니코드는 모든 언어를 하나의 인코딩으로 통일시켜서 더 이상 인코딩에 문제가 생기지 않게 한다.가장 자주 사용하는 것은 두 바이트로 한 문자를 표시하는 것이다. (매우 외진 문자를 사용하려면 네 바이트가 필요하다) 모A는 ASCII 인코딩으로 10진법의 65, 2진법의 01000001이다.문자 0은 ASCII 인코딩으로 10진법의 48이고 2진법의 0011000이며 문자'0'과 정수 0은 다르다는 것을 주의한다.한자는 ASCII 인코딩의 범위를 넘어섰고 유니코드 인코딩은 10진법의 20013, 2진법01001110 00101101이다.ASCII 인코딩된 A를 유니코드로 인코딩하면 앞에서 0만 보충하면 됩니다. 따라서 A의 유니코드 인코딩은 00000000 01000001입니다.
3. UTF-8
유니코드 인코딩으로 통일되면 코드 혼란 문제는 사라진다.그러나 만약에 당신이 쓴 텍스트가 기본적으로 모두 영어라면 유니코드 인코딩은 ASCII 인코딩보다 두 배의 저장 공간을 필요로 하기 때문에 저장과 전송에 있어서는 매우 수지가 맞지 않는다.유니코드 인코딩을 가변 길이 인코딩으로 바꾸는 UTF-8 인코딩이 나왔다.UTF-8 인코딩은 유니코드 문자를 숫자 크기에 따라 1-6 바이트로 인코딩하고, 자주 사용하는 영문 자모는 1 바이트로 인코딩하며, 한자는 보통 3 바이트로 생소한 문자만 4-6 바이트로 인코딩한다.만약 전송할 텍스트에 대량의 영문 문자가 포함되어 있다면, UTF-8 인코딩을 사용하면 공간을 절약할 수 있습니다. ASCII 인코딩은 실제로는 UTF-8 인코딩의 일부분으로 볼 수 있습니다.
현재 컴퓨터 시스템에서 통용되는 문자 인코딩 작업 방식:
컴퓨터 메모리에서 유니코드 인코딩을 일괄적으로 사용하고 하드디스크에 저장하거나 전송이 필요할 때 UTF-8 인코딩으로 변환한다.메모장으로 편집할 때 파일에서 읽은 UTF-8 문자는 유니코드 문자로 메모리로 변환되고, 편집이 완료되면 저장할 때 다시 유니코드를 UTF-8로 변환하여 파일에 저장한다. 웹 페이지를 조회할 때 서버는 동적으로 생성된 유니코드 내용을 UTF-8로 변환하여 브라우저로 전송한다.많은 웹 페이지의 원본 코드에 유사한 정보가 있는데, 이 웹 페이지가 바로 UTF-8 인코딩을 사용하고 있음을 나타낸다.
파이썬 문자열
파이썬 3 버전에서 문자열은 유니코드로 인코딩된 것으로 파이썬의 문자열은 다중 언어를 지원한다.e.g print(' string')
Python은 ord () 함수에서 문자를 가져오는 정수 표현을 제공하고chr () 함수는 인코딩을 대응하는 문자로 변환합니다.
ord('A') 결과: 65ord('중') 결과: 20013 chr(66) 결과:'B'chr(25991) 결과:'문'
문자의 정수 인코딩은 16진수로str를 사용할 수도 있습니다.
print('\u4e2d\u6587')'중국어
Python의 문자열 유형은str이며 메모리에 유니코드로 표시되며 문자는 여러 바이트에 해당합니다.네트워크에서 전송하거나 디스크에 저장하려면str를 바이트 단위의bytes로 변경해야 합니다.파이톤은 bytes 형식의 데이터에 대해 b 접두사를 가진 단인호나 쌍인호로 표시한다. x=b'ABC'는'ABC'와 b'ABC'를 구분하는데 전자는str이고 후자는 내용이 전자와 같지만 bytes의 모든 문자는 한 바이트만 차지한다.
>>> 'ABC'.encode('ascii')
b'ABC'
>>> '  '.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
>>> '  '.encode('ascii')
Traceback (most recent call last):
  File "", line 1, in 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

순수한 영어의str는 ASCII로bytes로 인코딩할 수 있으며 내용은 같고 중국어를 함유한str는UTF-8로bytes로 인코딩할 수 있다.중국어를 포함하는str는 ASCII 인코딩을 사용할 수 없습니다. 중국어 인코딩의 범위가 ASCII 인코딩의 범위를 초과하면 파이톤이 오류를 보고할 수 있습니다.bytes에서는 ASCII 문자로 표시되는 바이트를\x### 로 표시할 수 없습니다.네트워크나 디스크에서 바이트 흐름을 읽었다면 읽은 데이터는bytes입니다.bytes를str로 변경하려면 decode() 방법을 사용해야 합니다.
>>> b'ABC'.decode('ascii')
'ABC'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'  '

str에 포함된 문자는 len() 함수로 계산할 수 있습니다.
>>> len('ABC')
3
>>> len('  ')
2

len () 함수는str의 문자 수를 계산하고bytes로 바꾸면len () 함수는 바이트 수를 계산합니다.
>>> len(b'ABC')
3
>>> len(b'\xe4\xb8\xad\xe6\x96\x87')
6
>>> len('  '.encode('utf-8'))
6

Python 소스 코드도 텍스트 파일이기 때문에 원본 코드에 중국어가 포함되어 있을 때 원본 코드를 저장할 때 UTF-8 인코딩으로 저장해야 합니다.Python 해석기가 소스 코드를 읽을 때 UTF-8 인코딩으로 읽을 수 있도록 파일 시작 부분에 두 줄을 씁니다.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

첫 번째 줄의 주석은 Linux/OS X 시스템에 알리기 위해서입니다. 이것은 Python 실행 가능한 프로그램이고 Windows 시스템은 이 주석을 무시합니다.두 번째 줄의 주석은 Python 해석기에 UTF-8 인코딩에 따라 원본 코드를 읽는 것을 알려주기 위해서입니다. 그렇지 않으면 원본 코드에 쓴 중국어 출력이 혼란스러울 수 있습니다.
서식 적용
포맷된 문자열을 어떻게 출력합니까?'자기야 xxx 안녕!당신의 xx월 요금은 xx이고 잔액은 xx'같은 문자열입니다. xxx의 내용은 모두 변수에 따라 변화하기 때문에 간편하게 문자열을 포맷하는 방식이 필요합니다.Python에서 사용하는 포맷 방식은 C 언어와 일치하며% 로 이루어집니다. 예를 들어 다음과 같습니다.%d 정수%f 부동점수%s 문자열 x 16진수 정수 실례 1:
>>> 'Hello, %s' % 'world'
'Hello, world'
>>> 'Hi, %s, you have $%d.' % ('Michael', 1000000)
'Hi, Michael, you have $1000000.'

인스턴스 2:
>>> '%2d-%02d' % (3, 1)
' 3-01'
>>> '%.2f' % 3.1415926
'3.14'

인스턴스 3:
s1 = 72
s2 = 85
r = (s2-s1)/s1 * 100
print('%.1f%%' % r)

좋은 웹페이지 즐겨찾기