본문 바로가기

Programming Logs/C++

[C++] Is UTF 8

멀티바이트_CP949 -> UTF8을 해야 할 일이 생겼다

내 프로그램은 CP949였고, tgz 파일 압축 해제를 하는데, 내부 경로가 UTF-8인 경우였다

CP949로 읽어드리면 당연히 invalid string이므로 사용할 수가 없다

해당 과정은 (char*)멀티바이트_CP949 -> (wchar*)유니코드 -> (char*)UTF-8 의 과정을 거쳐야 했는데,

그 전에 멀티바이트(CP949)로 읽어드린 문자열이 UTF-8인 경우와 아닌 경우를 가를 수 있어야 했다

 

여기저기 찾다가 짜증나서 문자열 전체를 검토하는 방식으로 그냥 무식하게 만들었다

아마 여기서도 더 개선을 할 수 있을 거 같은데 빨리 집에 가고 싶어서 일단 점을 찍는다

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
//    ________________________________________________________________________________________________
bool IsUTF8(CString& str)
{
    //    UTF-8 format is like below
    //        1byte 0b 0xxx xxxx :
    //        2byte 0b 110x xxxx 10xx xxxx : 0xCX8X
    //        3byte 0b 1110 xxxx 10xx xxxx 10xx xxxx : 0xEX8X8X
    //        4byte 0b 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx : 0xFX8X8X8X
    for (int i = 0; i < str.GetLength(); i++)
    {
        unsigned char ch = (unsigned char)str.GetAt(i);
 
        if ((ch >> 7== 0// 1000 0000
        {
            //1 byte 
            continue;
        }
        else if ((ch >> 5== 0x06)
        {
            //2byte 
            int j = i + 1;
            if (j < str.GetLength())
            {
                unsigned char cj = (unsigned char)str.GetAt(j);
                if ((cj >> 6== 0x02)
                    return true;
            }
        }
        else if ((ch >> 4== 0x0E)
        {
            //3byte
            int j = i + 1;
            if (j < str.GetLength())
            {
                unsigned char cj = (unsigned char)str.GetAt(j);
                if ((cj >> 6== 0x02)
                {
                    int k = j + 1;
                    if (k < str.GetLength())
                    {
                        unsigned char ck = (unsigned char)str.GetAt(k);
                        if ((ck >> 6== 0x02)
                            return true;
                    }
                }
            }
        }
        else if ((ch >> 3== 0x1E)
        {
            //4byte
            int j = i + 1;
            if (j < str.GetLength())
            {
                unsigned char cj = (unsigned char)str.GetAt(j);
                if ((cj >> 6== 0x02)
                {
                    int k = j + 1;
                    if (k < str.GetLength())
                    {
                        unsigned char ck = (unsigned char)str.GetAt(k);
                        if ((ck >> 6== 0x02)
                        {
                            int l = k + 1;
                            if (l < str.GetLength())
                            {
                                unsigned char cl = (unsigned char)str.GetAt(l);
                                if ((cl >> 6== 0x02)
                                    return true;
                            }
                        }
                    }
                }
            }
        }
    }
 
    return false;
}
cs

 

 

참고로 변환과정 자체는 아래 블로그에서 큰 도움을 얻었다

 

 

---

ref

---

 

https://icartsh.tistory.com/13

 

c/c++에서 문자열 인코딩 변환! 유니코드 멀티바이트 UTF-8 쉽게 변환해보자~!

문자열을 인코딩 하는 방법은 여러가지가 있습니다.. 가장 널리 알려진 방법으로는 유니코드 -> 멀티바이트 wchar_t strUnicode[256] = {0,}; char strMultibyte[256] = {0,}; wcscpy_s(strUnicode,256,L"유니코드..

icartsh.tistory.com