오다기리 박의 알고리즘 노트

2장. 아스키코드 vs 유니코드 본문

운영체제

2장. 아스키코드 vs 유니코드

오다기리 박 2018. 8. 8. 23:14

2장. 아스키코드 vs 유니코드

1. Windows에서의 유니코드


  • 아스키 코드 : 초창기에는 다양한 방법으로 문자를 표현했는데, 호환 등 여러 문제가 발생했다. 이런 문제를 해결하기 위해 ANSI에서 ASCII(American Standard Code for Information Interchange)라는 표준 코드 체계를 제시했고, 현재 이 코드가 일반적으로 사용되고 있다.

  • 유니코드 : 각 나라별 언어를 모두 표현하기 위해 나온 코드 체계이다. 유니코드는 사용중인 운영체제, 프로그램, 언어에 관계없이 문자마다 고유한 코드 값을 제공하는 새로운 개념의 코드다. 언어와 상관없이 모든 문자를 16비트로 표현하므로 최대 65,536자를 표현할 수 있다.


아스키코드

유니코드

멀티바이트

미국 표준

전세계 표준


256개 문자를 1바이트로 표현

모든 문자를 2바이트로 표현

아스키코드에서 정의하지 않은 문자만 2바이트로 표현.

SBCS

(Single Byte Character Set)

WBCS

(Wide Byte Character Set)

MBCS

(Multi Byte Character Set)

ANSI 인코딩

UTF-8 인코딩



_T() 매크로 사용 : 와이드문자열로 처리

char 앞에 L : wchar로

_T() 매크로 사용


  • 문자셋(Character Sets)의 종류와 특성

    • SBCS

      • 문자를 표현하는 데 있어서 1바이트만을 사용하는 방식

      • “SBCS 기반의 문자열”, “아스키코드 기반의 문자열”

    • WBCS

      • 모든 문자를 2바이트로 처리하는 문자셋

      • “WBCS 기반 문자열”, “유니코드 기반 문자열”

    • MBCS

      • 다양한 바이트 수를 사용해서 문자를 표현하는 방식

      • SBCS < MBCS

      • 유니코드에 비해 효율적


  • MBCS 기반의 문자열

  • WBCS 기반의 프로그래밍

    • char 대신 wchar_t 자료형

    • “ABC” 대신 L”ABC”

      • L : 이어서 등장하는 문자열을 유니코드 기반으로 표현하라

    • 문자열 조작 함수

SBCS, MBCS 기반  함수

WBCS(유니코드 기반) 문자열 조작 함수

strlen

size_t wcslen (const wchar_t* string);

strcpy

wchar_t* wcscpy (wchar_t* dest, const wchar_t* src);

strncpy

wchar_t* wcsncpy (wchar_t* dest, const wchar_t* src, size_t cnt);

strcat

wchar_t* wcscat (wchar_t* dest, const wchar_t* src);

strncat

wchar_t* wcsncat (wchar_t* dest, const wchar_t* src, size_t cnt);

strcmp

int wcscmp (const wchar_t* s1, const wchar_t* s2);

strncmp

int wcsncmp (const wchar_t* s1, const wchar_t* s2, size_t cnt);


    • Windows 2000 이상의 운영체제는 모든 문자열을 유니코드 기반으로 처리한다.

    • 문자열 입출력 함수

SBCS  기반 함수

WBCS(유니코드 기반) 문자열 입출력 함수

printf

int wprintf (const wchar_t* format [,argument]...);

ex) wprintf(L”Hello world!”);

scanf

int wscanf (const wchar_t* format [,argument]...);

fgets(읽기)

wchar_t* fgetws (wchar_t* string, int n, FILE* stream);

fputs(쓰기)

int fputws (const wchar_t* string, FILE* stream);

      • wprintf, fputws로 유니코드 기반으로 한글 출력하려면 _wsetlocale (LC_ALL, L”korean”); //#include “locale.h” 선언 해야함.


2. MBCS와 WBCS의 동시 지원


  • 프로그램은 한번만 구현하고, 별다른 변경 없이 MBCS기반으로 돌아가는 형태로도, WBCS 기반으로 돌아가는 형태로도 컴파일 가능한 방법 소개

  • #include<window.h>

    • Windows 기반 프로그래밍을 하는 데 있어서 항상 포함해야 하는 헤더파일

  • Windows에서 정의하고 있는 자료형

    • #define CONST const;
      typedef char CHAR;
      typedef wchar_t WCHAR;
      typedef CHAR* LPSTR;
      typedef CONST CHAR* LPCSTR;
      typedef WCHAR* LPWSTR;
      typedef CONST WCHAR* LPCWSTR;

    • -> 선언의 편리성, 확장의 용이성

  • MBCS와 WBCS를 동시에 지원하기 위한 매크로

    • 매크로 기본

      • 디버그에 유용한 매크로

        • __FILE__, __FUNCTION__, __LINE__, __DATE__, __TIME__

      • 매크로 연산자 #과 ##

        • #은 매크로 함수의 인수를 문자열로 치환하고 ##은 두 인수를 붙여서 치환한다.

      • 조건부 컴파일 지시자

        • #undef ~ : ~ 매크로명의 정의 취소

    • Windows에서는 MBCS와 WBCS를 동시에 수용하는 형태의 프로그램 구현을 위해 매크로를 정의함

    • tchar.h에 선언되어 있는 내용

  • MBCS와 WBCS를 동시에 지원하기 위한 함수