이글은 예전 제 싸이월드 블로그에 작성한 글을 티스토리로 옮긴 것입니다.
원문 : http://cy.cyworld.com/home/21147242/post/55078597BC95739A07C68401
원문 작성일 : 2015.3.12

============================================================

 

임베디드 보드에서 유니코드를 처리할 일이 있어
일단 리눅스에서 테스트를 하였습니다.
별 탈 없이 문자열(ex) 한글) 잘 뿌리는 거 확인하고
테스트 보드로 포팅하여 테스트했더니 엇~ 문자열이 안나오는겁니다.
테스트보드에선 유니코드를 지원 안하나봅니다.
그래서 아래와 같이 테스트를 해 보았습니다.
1. 윈도우에서 메모장을 열고 한글을 입력합니다.
2. "다른이름으로 저장" 하게 되면 하단에 아래 그림과 같이 4가지 타입으로 저장할 수 있습니다.
3. 4개의 파일로 따로 저장합니다.
ex) test_ANSI.txt, test_Unicode.txt, test_Unicode_BE.txt, test_UTF-8.txt

 

 

그리고 생성한 4개의 txt 파일을 보드에 복사하여 열어봤습니다.
했더니 UTF-8 만 정상으로 나오고 나머지는 다 깨지네요.
아하~ 테스트보드는 UTF-8만 지원하나봅니다.
그럼 Unicode를 UTF-8 로 변환하여 출력하면 되겠군요.
Unicode ->UTF-8 로의 변환을 그림으로 표시하면 아래와 같습니다.
(도움받은 사이트 : http://en.wikipedia.org/wiki/UTF-8 )

 

위 사이트에 들어가보면 unicode 값이 0xffff 값보다 더 큰 경우에도 설명이 되어있는데
일단 그 범위까지 쓸일이 없기에 위 범위만 처리하였습니다.
이에 아래와 같이 변환하는 함수를 만들어 보았습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
void UnicodetoUTF8( const wchar_t * pUnicode, char * szText)
{
        int uniLen = wcslen(pUnicode) ;
 
        for ( int ii = 0; ii<uniLen; ii++)
        {
                if ( 0<= pUnicode[ii]&&pUnicode[ii]<= 0x7f)
                {
                        szText[0] = pUnicode[ii]&0xff ;
                        szText++ ;
                }
                else if ( 0x80<= pUnicode[ii]&&pUnicode[ii]<= 0x7ff)
                {
                        szText[0] = ((pUnicode[ii]>>6)&0x1f) | 0xc0 ;
                        szText[1] = (pUnicode[ii]&0x3f) | 0x80 ;
                        szText += 2 ;
                }
                else if ( 0x800<= pUnicode[ii]&&pUnicode[ii]<= 0xffff)
                {
                        szText[0] = ((pUnicode[ii]>>12)&0x0f) | 0xe0 ;
                        szText[1] = ((pUnicode[ii]>>6)&0x3f) | 0x80 ;
                        szText[2] = (pUnicode[ii]&0x3f) | 0x80 ;
                        szText += 3 ;
                }
                else
                {
                        printf( "ERROR~!! pUnicode>0xffff, 0x%x\n" , pUnicode[ii]) ;
                }
        }
        szText[0] = '\0' ;
 
        return ;
}
 

그럼, 즐프하세요~ ^^

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+ Recent posts