문자 인코딩

Programming 2013. 9. 11. 17:58 |


컴퓨터는 수치 연산만을 위해 설계되었기 때문에 초기의 컴퓨터는 문자를 표현하지 않았지만 시간이 갈수록 당연하게 문자 표현이 요구되었고, 컴퓨터간 문자데이터를 교환해야 할 일이 생기기도 했기에 문자 표현을 위한 표준, 규칙이 필요해지게 되었고, 이런 이유로 ASCII(American Standart Code for Information) 라는 표준 문자 인코딩이 만들어지게 되었다.


- ASCII(ANSI라고도 함) : 1Byte 코드로 모든 영문자를 저장할 수 있는 아주 간단한 코드 테이블.

7Bit(0~127)로도 모든 영문자, 숫자를 충분히 표기할 수 있기 때문에, 마지막 한 비트를 패리티비트로 두기도 한다.

그러나 이 방식은 전 세계의 다양한 문자를 나타내기에는 한계가 있었고, 


<유니코드>

UTF-8

UTF-8-BOM 아님

UTF-16

UTF-16-BOM 아님

UTF-16-Big Endian

UTF-16-Big Endian-BOM 아님


UTF-32



<한글 인코딩>

- CP949

- EUC-KR



파일 형식 알아내기

Unicode 텍스트화일의 경우 2바이트 또는 3바이트를 읽어보면 'byte order mask(BOM)' 라고 하여 텍스트 화일의 형식을 판단할 수 있는 플래그가 있다. 텍스트에 아무런 내용이 없더라도 byte order mask 는 무조건 존재한다.


UTF-8 : 3Byte - 0xEF, 0xBB, 0xBF

UTF-16 : 2Byte - 0xFF, 0xFE

UTF-16(Big Endian) : 2Byte - 0xFE, 0xFF

그 외 : ANSI





HTML

인코딩을 문서내에서 선언해주지 않으면 해당 파일의 글자가 깨진다.

물론 파일을 저장할 때 변경을 할 수 있지만, 선언해두지 않으면 아무리 UTF-8로 저장해도 브라우저는 ANSI(ASCII) 인코딩으로 인식하기 때문에 글자가 깨질 수 있다. (익스플로러는 해당이 안된다만 다른 브라우저는 깨질 수 있다고 함.)


<META> 태그 

HTML 문서에 대한 메타 데이터를 제공하는 역할을 한다.

- HTML

<META http-equiv="Content-Type" content="text/html; charset=UTF-8" />

- HTML5 : html보다 간단해졌고, 스키마 속성을 지원하지 않는다.

<META charset="UTF-8">




MFC

프로젝트 설정의 Configuration Properties - Project Defaults - Character Set에서 Multibyte / Unicode 를 선택할 수 있다.

예전엔 Multibyte를 사용하고 있었는데, Unicode로 옮겨가는 추세이다.


CStdioFile 에는 유니코드를 읽어오는 기능이 애초부터 없었다고 한다.

그러나 이 방법을 사용하면 적어도 UTF-8, UTF-16은 깨지지 않은 채로 부르거나 읽어올 수 있다고 한다.


//
// For Writing
//

// Old-Style... do not use...
//CStdioFile f;
//f.Open(_T("\test.txt"), CFile::modeCreate | CFile::modeWrite);

// Open the file with the specified encoding
FILE *fStream;
errno_t e = _tfopen_s(&fStream, _T("\test.txt"), _T("wt,ccs=UNICODE"));
if (e != 0) return; // failed..
CStdioFile f(fStream);  // open the file from this stream

f.WriteString(_T("Test"));
f.Close();

//
// For Reading
//

// Open the file with the specified encoding
FILE *fStream;
errno_t e = _tfopen_s(&fStream, _T("\test.txt"), _T("rt,ccs=UNICODE"));
if (e != 0) return; // failed..CString sRead;
CStdioFile f(fStream);  // open the file from this stream
CString sRead;
f.ReadString(sRead);
f.Close();

코드 출처 : http://www.codeproject.com/Tips/465194/Read-and-write-text-files-in-Unicode-through-CStdi


_tfopen_s의 인자로, 인코딩 정보를 전해준다.

자세한 설명은 링크 참조. http://msdn.microsoft.com/ko-kr/library/z5hh6ee9(v=vs.90).aspx

* Visual studio 2010  기준 css=ANSI 안됨. (내부 코드 자체에서 검사를 안함)






참고

한글 인코딩의 이해 1편 : 한글 인코딩의 역사와 유니코드

http://cafe.naver.com/sec/1971

http://cafe.naver.com/pinkz8ren/4471

http://blog.naver.com/x1amnesia1x/80193310812

http://eslife.tistory.com/253

http://kin.naver.com/qna/detail.nhn?dirId=1040101&docId=63878007&qb=bWZjIHR4dCDsnbjsvZTrlKkg7ZiV7Iud

http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=844988&ref=844988


참고해야할 자료들

http://six605.tistory.com/309

http://sonbosun.tistory.com/7

http://www.gpgstudy.com/forum/viewtopic.php?p=37519

http://blog.naver.com/PostView.nhn?blogId=bigjys&logNo=100085647945

http://eslife.tistory.com/253



'Programming' 카테고리의 다른 글

DBMS  (0) 2015.02.27
일반화 프로그래밍(Generic Programming)  (0) 2015.02.02
온라인 게임 처음부터 끝까지 동적 언어로 만들기 (Lua)  (0) 2014.02.11
Lua script  (0) 2014.02.11
트랜잭션, 롤백, 커밋  (0) 2013.11.07
Posted by HUEJI
: