TOC
컴퓨터에서의 문자표현
저장방식
- 메모리는 숫자만을 저장할 수 있다.
- 픽셀로 글자 모양 그대로 저장하는 비트맵이 있지만 이는 메모리 낭비가 크다.
- 각 문자에 대해서 대응되는 숫자를 정해놓고 이것을 메모리에 저장!!
- 영어 대소문자 52 -> 6비트(64가지)로 모두 표현할 수 있다. 이를
코드체계
라고 한다.
문자의 표현
- 지역별로 코드체계가 달랐다.
- 그런데 네트워크가 발전하면서 서로 소통, 이때 정보를 다르게 해석하는 경우가 생겼다.
- 그래서
ASCII
라는 문자 인코딩 표준이 제정되었다.
ASCII
- 7bits 인코딩
- 33개의 출력 불가능한 제어 문자
- 95개의 출력 가능 문자(공백 32 특수문자 숫자 기호1 대문자 기호2 소문자 기호3)
확장 ASCII
- 표준 아스키 7bits, 확장 아스키 8bits
- 8bits 또는 8-bit로 표현
- 표준 문자 이외에 부가적인 문자 128개 추가 가능
- 표준 아스키는 세계적으로 통용, 확장 아스키는 사용 하드웨어, 국가 등에 따라 유연하게 지정 가능
- 표준 아스키는 불변의 법칙, 확장 아스키는 유연한 규칙 같은 느낌
유니코드
- 오늘날 대부분 ASCII 형식을 사용해 문자를 읽고 쓴다.
- 각 국가별로 문자를 표현하기 위한 코드체계 필요
- 유니코드 : 국가간의 정보 교환, 다국어 처리를 위해 표준을 마련한 것
유니코드 Character Set
- 유니코드를 저장하는 변수의 크기
- UCS-2(Universal Character Set 2) : 2byte
- UCS-4(Universal Character Set 4) : 4byte
바이트 순서에 대한 표준화
실패- 파일 인식 시 UCS 타입을 인식하고 경우에 따라 다르게 구현해야 되는 것
- 적당한 외부 인코딩이 필요하게 되었다.
유니코드 인코딩
UTF-8
- in web
- MIN : 8bit, MAX: 32bit(1Byte*4)
UTF-16
- in window, java
- MIN : 16bit, MAX: 32bit(2Byte*2)
UTF-32
- in unix
- MIN : 32bit, MAX: 32bit(4Byte*1)
파이썬 인코딩
- 2.x버전 - ASCII :
#-*- coding: utf-8 -*-
첫 줄에 명시 - 3.x버전 - 유니코드 UTF-8 생략 가능
- 다른 인코딩 방식 처리 시 첫 줄에 인코딩 방식 작성
문자열의 분류
- 문자열은 고정길이(fixed length)와 가변길이(variable length)로 구분
- 가변길이는 length controlled(java, python)과 delimited(C언어)로 구분
length controlled 메모리 배치(java)
- 기본적인 객체 메타 데이터 외에도 몇 가지 정보가 더 있다.
- hash값
- 문자열 길이(count)
- 문자열 데이터의 시작점(offset)
- 실제 문자열 배열에 대한 참조(value)
delimited 메모리 배치(C언어)
- C언어는 메타 데이터만 저장할 수 있다.
- 마지막에 끝을 표시하는 null문자(\0)를 넣어줘야 한다.
char ary[]={'a', 'b', 'c', '\0'}; // 또는 char ary[]="abc";
- 문자열 처리에 필요한 연산을 함수 형태로 제공
- strlen(), strcpy(), strcmp(),...
C와 Java의 String 처리의 차이
- C는 아스키 코드로 저장
- java는 유니코드(UTF16, 2byte)로 저장
- Python은 유니코드(UTF8)로 저장
Null과 None
- None : 무(無)의 상태. 정의되지 않았다.
- Null : 없음으로 정의된 상태. 숫자로 표현하면 0으로 표현
문자열의 비교
- C : strcomp()
- java : equals()
- Python : is와
==
s1 = 'abc'
s2 = 'abc'
s3 = s1
s4 = s1[:2] + 'c'
모두 abc의 값은 결과값이다. 그렇다면 이들을 비교하면 어떻게 될까.
print(s1 == s2) # True
print(s1 is s2) # True
print(s1 == s4) # False
print(s1 is s4) # False
- 파이썬에서
==
연산은 메모리 참조가 같은지를 묻는 것. - 파이썬에서 slicing을 하면 같은 결과더라도 참조가 다르다.
- 출력은 같지만 참조가 다르기 때문에 비교하면 False가 나온다.
파이썬에서의 슬라이싱
- 인덱스를 기준으로 하여 잘라내거나 복제하는 작업
b = a[::]
처럼 스스로를 복제하는 경우
- 리스트는 메모리 참조가 다르다.
- 문자열은 메모리 참조가 같다.
b = a[:?]+?
처럼 일부를 복제하는 경우
- 리스트와 문자열 모두 메모리 참조가 다르다.
문자와 숫자의 형 변환
- C언어 : atoi(), itoa()
- java : 숫자 class의 parse 메소드 / toString() 메소드
- 파이썬 : 숫자와 문자변환 함수(int('123'), float('1.23'), str(123), repr(123))
atoi() 함수 만들어보기
def atoi(s):
i = 0
for x in s:
i = i*10 + ord(x) - ord('0')
return i