멀티바이트_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