천객만래 [千客萬來] (It has an interminable succession of visitors)

[개발/VC++] API를 이용한 ASCII와 UNICODE변환및 코드페이지를 이용한 변환방법



출처 : 인터넷


API를 이용한 ASCII와 UNICODE변환및 코드페이지를 이용한 변환방법 
 


[사용예제]

// 멀티바이트문자열 --> 와이드문자열
 char chText[100] = "abcdefg";  // 멀티바이트 문자열
 wchar_t* pszTmp = NULL; // 와이드만자열로 변경해서 저장될 주소
 int iLen = ::MultiByteToWideChar(CP_ACP, 0, pszText, -1, pszTmp, 0);
 pszTmp = new wchar_t[iLen+1];
 ::MultiByteToWideChar(CP_ACP, 0, pszText, -1, pszTmp, iLen);

 wchar_t tcResult[MAX_PATH] = _T("");
 wcscpy( tcResult, pszTmp ); 
 delete [] pszTmp;


// 와이드문자열 --> 멀티바이트문자열
wchar_t wcText[100] = _T("abcdefg");
char* pTemp = NULL;
int iLen = ::WideCharToMultiByte(CP_ACP, 0, wcText, -1, pTemp, 0, NULL, NULL);
pTemp = new char[iLen+1];
::WideCharToMultiByte(CP_ACP, 0, wcText, -1, pTemp, iLen, NULL, NULL);

char chResult[MAX_PAHT] = "";
strcpy( chResult, pszTemp );
delete [] pTemp;

 

 


 

 

 
Counter. 215

 

 
=========================================================
● API를 이용한 ASCII와 UNICODE의 변환방법
=========================================================
//////////////////////////////////////////////////
// 문자열을 유니코드 문자열(wide-character)로 매핑한다.
//
// 이 함수에 의해 매핑되는 문자열은 multibyte character set으로 부터 반드시 유래하는 건 아니다.
//////////////////////////////////////////////////
int MultiByteToWideChar (
UINT CodePage, // code page
DWORD dwFlags, // character-type options
LPCSTR lpMultiByteStr, // string to map
int cbMultiByte, // number of bytes in string
LPWSTR lpWideCharStr, // wide-character buffer
int cchWideChar // size of buffer
);
CodePage :
[in] 변환 수행에 사용될 code page를 기술한다.
이 파라메타는 설치되거나 또는 시스템에 유효한 어떤한 코드페이지가 될수 있다.
또는 아래에 기술된 값중 하나를 기술할 수 있다.

CP_ACP : ANSI 코드 페이지
CP_MACCP : Macintosh 코드 페이지
CP_OEMCP : OEB 코드 페이지

lpMultiByteStr :
[in] 변환 되어질 문자열 스트링 포인터

cbMultiByte
[in] lpMultiByteStr 파라메타에 의해 포인트된 문자열의 바이트 사이즈
lpWideCharStr
[out] 변환된 문자열을 수신할 버퍼 포인터
cchWideChar
[in] wide character로, lpWideCharStr파라메타에 의해 포인트된 버퍼의 크기
만약 이값이 0이면, 이함수는 wide character로 요구되어진 buffer size를 반환한다,
그리고 lpWideCharStr 버퍼의 사용을 하지 않는다.
Return Values

If the function succeeds, and cchWideChar is nonzero, the return value is the number of wide characters written to the buffer pointed to by lpWideCharStr.
If the function succeeds, and cchWideChar is zero, the return value is the required size, in wide characters, for a buffer that can receive the translated string.
If the function fails, the return value is zero. To get extended error information, call GetLastError. GetLastError may return one of the following error codes:
ERROR_INSUFFICIENT_BUFFER
ERROR_INVALID_FLAGS
ERROR_INVALID_PARAMETER
ERROR_NO_UNICODE_TRANSLATION
▷ASCII ==> UNICODE 변환방법
// sTime이란 ANSI 무낮열을 bstr이란 이름의 유니코드(BSTR타입) 변수로 변환
char sTime[] = '유니코드 변환 예제';
BSTR bstr;
// sTime을 유니코드로 변환하기에 앞서 먼저 그것의 유니코드에서의 길이를 알아야 한다.
int nLen = MultiByteToWideChar(CP_ACP, 0, sTime, lstrlen(sTime), NULL, NULL)
// 얻어낸 길이만큼 메모리를 할당한다.
bstr = SysAllocStringLen(NULL, nLen);
// 이제 변환을 수행한다.
MultiByteToWideChar(CP_ACP, 0, sTime, lstrlen(sTime), bstr, nLen);
▷UNICODE ==> ASCII 변환방법
// newVal이란 BSTR 타입에 있는 유니코드 문자열을 sTime이라는 ANSI 문자열로 변환
char sTime[128];
WideCharToMultiByte(CP_ACP, 0, newVal, -1, sTime, 127/*원래크기보다 1작게*/, NULL, NULL);

===================================================
● 코드 페이지를 이용하여 조합/완성/유니코드를 주무르자.
====================================================
윈도우즈 API에서 MultiByteToWideChar와 WideCharToMultiByte를 이용하면 완성,
조합에서 유니코드로 혹은 그 반대로 변환을 할 수 있습니다.
한글 95나 NT의 경우 기본적으로 조합형과 완성형의 코드페이지가 설치 되어있으므로 문제가 없으나
영문의 경우는 IE에서 한글 package를 설치하면 완성형은 설치가 되나 조합형은 없습니다.
코드페이지 설치.
'CP_XXX.nls'(WIN95) or 'C_XXX.nls'(WINNT)를 구하십시요. XXX 는 1361(조합) or 949(완성)입니다.
레지스트리에 다음의 값을 입력하십시요.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage\XXX=CP_XXX.nls (WIN95)
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage\XXX=C_XXX.nls (WINNT)
조합형 코드를 보고자 할때는 cp_1361.nls(95용), c_1361.nls(nt용)을 구하셔서 시스템에 설치를 합니다.
95의 경우 system 디렉토리에, NT의 경우 system32 디렉토리에 설치하십시요.
=====================================================================
/*
* MultiByteToWideChar와 WideCharToMultiByte를 이용한 완성형, 조합형, 유니코드 변환.
*/
#include
#define CP_WANSUNG 949
#define CP_JOHAB 1361

void ConvertWansungToUnicode (LPCSTR szInput, int nInputSize, LPWSTR* szUnicode, int* nUnicodeSize)
{
// 유니코드의 크기를 구한다.
*nUnicodeSize = MultiByteToWideChar(CP_WANSUNG, 0,
szInput, nInputSize,
NULL, 0);
*szUnicode = (LPWSTR)malloc(nUnicodeSize*sizeof(WCHAR));
// 실제 유니코드로 변환.
MultiByteToWideChar(CP_WANSUNG, 0,
szInput, nInputSize,
*szUnicode, *nUnicodeSize);
}
void ConvertJohabToUnicode (LPCSTR szInput, int nInputSize, LPWSTR* szUnicode, int* nUnicodeSize)
{
// 유니코드의 크기를 구한다.
*nUnicodeSize = MultiByteToWideChar(CP_JOHAB, 0,
szInput, nInputSize,
NULL, 0);
*szUnicode = (LPWSTR)malloc(nUnicodeSize*sizeof(WCHAR));
// 실제 유니코드로 변환.
MultiByteToWideChar(CP_WANSUNG, 0,
szInput, nInputSize,
*szUnicode, *nUnicodeSize);
}
void ConvertWansungToJohab (LPCSTR szInput, int nInputSize, LPSTR* szOutput, int* nOutputSize)
{
int nUnicodeSize;
LPWSTR szUnicode;
// 1. 완성형을 유니코드로 변환
// 유니코드의 크기를 구한다.
nUnicodeSize = MultiByteToWideChar(CP_WANSUNG, 0,
szInput, nInputSize,
NULL, 0);
szUnicode = (LPWSTR)malloc(nUnicodeSize*sizeof(WCHAR));
// 실제 유니코드로 변환.
MultiByteToWideChar(CP_WANSUNG, 0,
szInput, nInputSize,
szUnicode, nUnicodeSize);
// 2. 유니코드를 조합형으로 변환.
// 조합형의 크기를 구한다.
*nOutputSize = WideCharToMultiByte(CP_JOHAB, 0,
szUnicode, nUnicodeSize,
NULL, 0, NULL,NULL);
*szOutput = (LPSTR)malloc(*nOutputSize);
// 실제 조합형으로 변환.
WideCharToMultiByte(CP_JOHAB, 0,
szUnicode, nUnicodeSize,
*szOutput, *nOutputSize, NULL,NULL);
free(szUnicode);
}
유니코드 문자열을 UTF8 문자열로 변환하는 방법

KB Article ID: K001368

--------------------------------------------------------------------------------

이 내용이 적용되는 제품:
- Platform SDK

[요 약]

한글 윈도우 95에서 유니코드 문자열을 UTF8 문자열로 변환해 주는 다음 함수를 실행하면, 리턴되는 UTF8 버퍼에 아무런 값도 리턴 되지 않습니다. RFC2044에 명시된 스펙에 의거하여 문자열 변환하는 방법을 소개합니다.

#include “winnls.h”
WideCharToMultiByte(CP_UTF8, 0, szUniBuf, nUniLen, szUTFBuf, sizeof(szUTFBuf), NULL, NULL);

[추가 정보]

한글 윈도우 95에서 WIN32 API인 WideCharToMultiByte(CP_UTF8, xxx) 함수에서 UTF8 버퍼에 아무런 값도 리턴하지 않으므로 다음과 같이 스펙에 의거한 변환 루틴을 이용하여 UTF8 문자열 값을 얻습니다.

char* UnicodeToUTF8(wchar_t uc, char* UTF8)
{
if (uc <= 0x7f)
{
UTF8[0] = (char) uc;
UTF8[1] = (char) '\0';
}
else if (uc <= 0x7ff)
{
UTF8[0] = (char) 0xc0 + uc / (wchar_t) pow(2, 6);
UTF8[1] = (char) 0x80 + uc % (wchar_t) pow(2, 6);
UTF8[2] = (char) '\0';
}
else if (uc <= 0xffff)
{
UTF8[0] = (char) 0xe0 + uc / (wchar_t) pow(2, 12);
UTF8[1] = (char) 0x80 + uc / (wchar_t) pow(2, 6) % (wchar_t) pow(2, 6);
UTF8[2] = (char) 0x80 + uc % (wchar_t) pow(2, 6);
UTF8[3] = (char) '\0';
}

return UTF8;
}

int WideStrToUTF8Str(wchar_t *szUni,char *szUTF8)
{
int i=0;
char TempUTF8[10];
for(i=0;szUni[i];i++) {
UnicodeToUTF8(szUni[i], TempUTF8);
strcat(szUTF8, TempUTF8);
}
return strlen(szUTF8);
}

실제 위 두 함수를 사용하는 예제

{
wchar_t szUniBuf[MAXBUF];
int nUniLen, nUTFLen;
char szUTFBuf[MAXBUF];

nUniLen = MultiByteToWideChar(CP_ACP, 0, szHello, strlen(szHello), szUniBuf, MAXBUF);
szUniBuf[nUniLen] = 0;
memset(szUTFBuf, 0, MAXBUF);
nUTFLen = WideStrToUTF8Str(szUniBuf, szUTFBuf);
//nUTFLen = WideCharToMultiByte(CP_UTF8, 0, szUniBuf, nUniLen, szUTFBuf, MAXBUF, NULL, NULL);
szUTFBuf[nUTFLen]=0x00;

}


한글 EBCIDIC 코드를 한글 ASCII 코드로 변환하는 방법

KB Article ID: K001143

--------------------------------------------------------------------------------

[요 약]

프로그래밍적으로, 한글 EBCIDIC 코드를 한글 ASCII 코드로 변환하는 방법을
여기에서 소개한다.

[추가 정보]

#include 'snanls.h'
function()
{
int ret;
LPCTSTR lpSrcStr, lpDestStr;
ret =SnaInit(CP_949);
printf('ret = %d', ret);
ret = SnaNlsMapString (lpSrcStr, lpDestStr, CP_933, CP_949, 2, 2,
SNA_MULTIBYTE, SNA_MULTIBYTE, 0x0);
printf('ret = %d', ret);
}


1. SnaInit(CP_949)는 현재 이 프로그램이 실행되는 환경의 코드 페이지를
지정한다.
2. lpSrcStr은 IBM 메인 프레임 컴퓨터 등으로부터 받은 한글 EBCIDIC 코드이며,
lpDestStr은 리턴되는 ASCII 코드값이다.
3. #define CP_933 933 /* EBCDIC Korean */
#define CP_949 949 /* Korean */
UTF-8 to Unicode / Unicode to UTF-8 transformation 


Posted by SB패밀리


URLEncode Code Chart

The following is a chart of ascii values for 256 characters in URL-encoding form. These values can be used for URL-encoding non-standard letters and characters for display in browsers and plug-ins which support them. (The codes below are in hexadecimal format. Click here for an ascii chart with decimal values for use with ord and chr functions).

For automated encoding, try Kurt Dommermuth's Flash URL Encoder (requires Flash 5 or higher). Type a string in the box on the left and click Encode to see and capture the coded string on the right.

æ







backspace
tab
linefeed


c return


















space
!
"
#
$
%
&
'
(
)
*
+
,
-
.
/
%00
%01
%02
%03
%04
%05
%06
%07
%08
%09
%0a
%0b
%0c
%0d
%0e
%0f
%10
%11
%12
%13
%14
%15
%16
%17
%18
%19
%1a
%1b
%1c
%1d
%1e
%1f
%20
%21
%22
%23
%24
%25
%26
%27
%28
%29
%2a
%2b
%2c
%2d
%2e
%2f
0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
[
\
]
^
_
%30
%31
%32
%33
%34
%35
%36
%37
%38
%39
%3a
%3b
%3c
%3d
%3e
%3f
%40
%41
%42
%43
%44
%45
%46
%47
%48
%49
%4a
%4b
%4c
%4d
%4e
%4f
%50
%51
%52
%53
%54
%55
%56
%57
%58
%59
%5a
%5b
%5c
%5d
%5e
%5f
`
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
{
|
}
~

€


ƒ




ˆ

Š

Œ



%60
%61
%62
%63
%64
%65
%66
%67
%68
%69
%6a
%6b
%6c
%6d
%6e
%6f
%70
%71
%72
%73
%74
%75
%76
%77
%78
%79
%7a
%7b
%7c
%7d
%7e
%7f
%80
%81
%82
%83
%84
%85
%86
%87
%88
%89
%8a
%8b
%8c
%8d
%8e
%8f








˜

š

œ


Ÿ

¡
¢
£

¥
|
§
¨
©
ª
«
¬
¯
®
¯
°
±
²
³
´
µ

·
¸
¹
º
»
¼
½
¾
¿
%90
%91
%92
%93
%94
%95
%96
%97
%98
%99
%9a
%9b
%9c
%9d
%9e
%9f
%a0
%a1
%a2
%a3
%a4
%a5
%a6
%a7
%a8
%a9
%aa
%ab
%ac
%ad
%ae
%af
%b0
%b1
%b2
%b3
%b4
%b5
%b6
%b7
%b8
%b9
%ba
%bb
%bc
%bd
%be
%bf
À
Á
Â
Ã
Ä
Å
Æ
Ç
È
É
Ê
Ë
Ì
Í
Î
Ï
Ð
Ñ
Ò
Ó
Ô
Õ
Ö

Ø
Ù
Ú
Û
Ü
Ý
Þ
ß
à
á
â
ã
ä
å
æ
ç
è
é
ê
ë
ì
í
î
ï
%c0
%c1
%c2
%c3
%c4
%c5
%c6
%c7
%c8
%c9
%ca
%cb
%cc
%cd
%ce
%cf
%d0
%d1
%d2
%d3
%d4
%d5
%d6
%d7
%d8
%d9
%da
%db
%dc
%dd
%de
%df
%e0
%e1
%e2
%e3
%e4
%e5
%e6
%e7
%e8
%e9
%ea
%eb
%ec
%ed
%ee
%ef
ð
ñ
ò
ó
ô
õ
ö
÷
ø
ù
ú
û
ü
ý
þ
ÿ

%f0
%f1
%f2
%f3
%f4
%f5
%f6
%f7
%f8
%f9
%fa
%fb
%fc
%fd
%fe
%ff





Ascii Code Chart (for use with ord and chr functions)

The following chart shows which characters are associated with each of 256 ascii values, displayed in decimal.  (Warning: Display of symbols is associated with operating system, browser and software application being run.  Test the codes in the environment in which you wish to use them.) Click here for a chart with hex values for URL encoding.
æ







backspace
tab
linefeed


c return


















space
!
"
#
$
%
&
'
(
)
*
+
,
-
.
/
00
01
02
03
04
05
06
07
08
09
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
0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
[
\
]
^
_
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
`
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
{
|
}
~

€


ƒ




ˆ

Š

Œ



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143








˜

š

œ


Ÿ

¡
¢
£

¥
|
§
¨
©
ª
«
¬
¯
®
¯
°
±
²
³
´
µ

·
¸
¹
º
»
¼
½
¾
¿
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
À
Á
Â
Ã
Ä
Å
Æ
Ç
È
É
Ê
Ë
Ì
Í
Î
Ï
Ð
Ñ
Ò
Ó
Ô
Õ
Ö

Ø
Ù
Ú
Û
Ü
Ý
Þ
ß
à
á
â
ã
ä
å
æ
ç
è
é
ê
ë
ì
í
î
ï
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
ð
ñ
ò
ó
ô
õ
ö
÷
ø
ù
ú
û
ü
ý
þ
ÿ

240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255


Posted by SB패밀리

출처 : 인터넷


API를 이용한 ASCII와 UNICODE변환및 코드페이지를 이용한 변환방법
 


[사용예제]

// 멀티바이트문자열 --> 와이드문자열
 char chText[100] = "abcdefg";  // 멀티바이트 문자열
 wchar_t* pszTmp = NULL; // 와이드만자열로 변경해서 저장될 주소
 int iLen = ::MultiByteToWideChar(CP_ACP, 0, pszText, -1, pszTmp, 0);
 pszTmp = new wchar_t[iLen+1];
 ::MultiByteToWideChar(CP_ACP, 0, pszText, -1, pszTmp, iLen);

 wchar_t tcResult[MAX_PATH] = _T("");
 wcscpy( tcResult, pszTmp );
 delete [] pszTmp;


// 와이드문자열 --> 멀티바이트문자열
wchar_t wcText[100] = _T("abcdefg");
char* pTemp = NULL;
int iLen = ::WideCharToMultiByte(CP_ACP, 0, wcText, -1, pTemp, 0, NULL, NULL);
pTemp = new char[iLen+1];
::WideCharToMultiByte(CP_ACP, 0, wcText, -1, pTemp, iLen, NULL, NULL);

char chResult[MAX_PAHT] = "";
strcpy( chResult, pszTemp );
delete [] pTemp;

 

 


 

 

 
Counter. 215

 

 
=========================================================
● API를 이용한 ASCII와 UNICODE의 변환방법
=========================================================
//////////////////////////////////////////////////
// 문자열을 유니코드 문자열(wide-character)로 매핑한다.
//
// 이 함수에 의해 매핑되는 문자열은 multibyte character set으로 부터 반드시 유래하는 건 아니다.
//////////////////////////////////////////////////
int MultiByteToWideChar (
UINT CodePage, // code page
DWORD dwFlags, // character-type options
LPCSTR lpMultiByteStr, // string to map
int cbMultiByte, // number of bytes in string
LPWSTR lpWideCharStr, // wide-character buffer
int cchWideChar // size of buffer
);
CodePage :
[in] 변환 수행에 사용될 code page를 기술한다.
이 파라메타는 설치되거나 또는 시스템에 유효한 어떤한 코드페이지가 될수 있다.
또는 아래에 기술된 값중 하나를 기술할 수 있다.

CP_ACP : ANSI 코드 페이지
CP_MACCP : Macintosh 코드 페이지
CP_OEMCP : OEB 코드 페이지

lpMultiByteStr :
[in] 변환 되어질 문자열 스트링 포인터

cbMultiByte
[in] lpMultiByteStr 파라메타에 의해 포인트된 문자열의 바이트 사이즈
lpWideCharStr
[out] 변환된 문자열을 수신할 버퍼 포인터
cchWideChar
[in] wide character로, lpWideCharStr파라메타에 의해 포인트된 버퍼의 크기
만약 이값이 0이면, 이함수는 wide character로 요구되어진 buffer size를 반환한다,
그리고 lpWideCharStr 버퍼의 사용을 하지 않는다.
Return Values

If the function succeeds, and cchWideChar is nonzero, the return value is the number of wide characters written to the buffer pointed to by lpWideCharStr.
If the function succeeds, and cchWideChar is zero, the return value is the required size, in wide characters, for a buffer that can receive the translated string.
If the function fails, the return value is zero. To get extended error information, call GetLastError. GetLastError may return one of the following error codes:
ERROR_INSUFFICIENT_BUFFER
ERROR_INVALID_FLAGS
ERROR_INVALID_PARAMETER
ERROR_NO_UNICODE_TRANSLATION
▷ASCII ==> UNICODE 변환방법
// sTime이란 ANSI 무낮열을 bstr이란 이름의 유니코드(BSTR타입) 변수로 변환
char sTime[] = '유니코드 변환 예제';
BSTR bstr;
// sTime을 유니코드로 변환하기에 앞서 먼저 그것의 유니코드에서의 길이를 알아야 한다.
int nLen = MultiByteToWideChar(CP_ACP, 0, sTime, lstrlen(sTime), NULL, NULL)
// 얻어낸 길이만큼 메모리를 할당한다.
bstr = SysAllocStringLen(NULL, nLen);
// 이제 변환을 수행한다.
MultiByteToWideChar(CP_ACP, 0, sTime, lstrlen(sTime), bstr, nLen);
▷UNICODE ==> ASCII 변환방법
// newVal이란 BSTR 타입에 있는 유니코드 문자열을 sTime이라는 ANSI 문자열로 변환
char sTime[128];
WideCharToMultiByte(CP_ACP, 0, newVal, -1, sTime, 127/*원래크기보다 1작게*/, NULL, NULL);

===================================================
● 코드 페이지를 이용하여 조합/완성/유니코드를 주무르자.
====================================================
윈도우즈 API에서 MultiByteToWideChar와 WideCharToMultiByte를 이용하면 완성,
조합에서 유니코드로 혹은 그 반대로 변환을 할 수 있습니다.
한글 95나 NT의 경우 기본적으로 조합형과 완성형의 코드페이지가 설치 되어있으므로 문제가 없으나
영문의 경우는 IE에서 한글 package를 설치하면 완성형은 설치가 되나 조합형은 없습니다.
코드페이지 설치.
'CP_XXX.nls'(WIN95) or 'C_XXX.nls'(WINNT)를 구하십시요. XXX 는 1361(조합) or 949(완성)입니다.
레지스트리에 다음의 값을 입력하십시요.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage\XXX=CP_XXX.nls (WIN95)
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage\XXX=C_XXX.nls (WINNT)
조합형 코드를 보고자 할때는 cp_1361.nls(95용), c_1361.nls(nt용)을 구하셔서 시스템에 설치를 합니다.
95의 경우 system 디렉토리에, NT의 경우 system32 디렉토리에 설치하십시요.
=====================================================================
/*
* MultiByteToWideChar와 WideCharToMultiByte를 이용한 완성형, 조합형, 유니코드 변환.
*/
#include
#define CP_WANSUNG 949
#define CP_JOHAB 1361

void ConvertWansungToUnicode (LPCSTR szInput, int nInputSize, LPWSTR* szUnicode, int* nUnicodeSize)
{
// 유니코드의 크기를 구한다.
*nUnicodeSize = MultiByteToWideChar(CP_WANSUNG, 0,
szInput, nInputSize,
NULL, 0);
*szUnicode = (LPWSTR)malloc(nUnicodeSize*sizeof(WCHAR));
// 실제 유니코드로 변환.
MultiByteToWideChar(CP_WANSUNG, 0,
szInput, nInputSize,
*szUnicode, *nUnicodeSize);
}
void ConvertJohabToUnicode (LPCSTR szInput, int nInputSize, LPWSTR* szUnicode, int* nUnicodeSize)
{
// 유니코드의 크기를 구한다.
*nUnicodeSize = MultiByteToWideChar(CP_JOHAB, 0,
szInput, nInputSize,
NULL, 0);
*szUnicode = (LPWSTR)malloc(nUnicodeSize*sizeof(WCHAR));
// 실제 유니코드로 변환.
MultiByteToWideChar(CP_WANSUNG, 0,
szInput, nInputSize,
*szUnicode, *nUnicodeSize);
}
void ConvertWansungToJohab (LPCSTR szInput, int nInputSize, LPSTR* szOutput, int* nOutputSize)
{
int nUnicodeSize;
LPWSTR szUnicode;
// 1. 완성형을 유니코드로 변환
// 유니코드의 크기를 구한다.
nUnicodeSize = MultiByteToWideChar(CP_WANSUNG, 0,
szInput, nInputSize,
NULL, 0);
szUnicode = (LPWSTR)malloc(nUnicodeSize*sizeof(WCHAR));
// 실제 유니코드로 변환.
MultiByteToWideChar(CP_WANSUNG, 0,
szInput, nInputSize,
szUnicode, nUnicodeSize);
// 2. 유니코드를 조합형으로 변환.
// 조합형의 크기를 구한다.
*nOutputSize = WideCharToMultiByte(CP_JOHAB, 0,
szUnicode, nUnicodeSize,
NULL, 0, NULL,NULL);
*szOutput = (LPSTR)malloc(*nOutputSize);
// 실제 조합형으로 변환.
WideCharToMultiByte(CP_JOHAB, 0,
szUnicode, nUnicodeSize,
*szOutput, *nOutputSize, NULL,NULL);
free(szUnicode);
}
유니코드 문자열을 UTF8 문자열로 변환하는 방법

KB Article ID: K001368

--------------------------------------------------------------------------------

이 내용이 적용되는 제품:
- Platform SDK

[요 약]

한글 윈도우 95에서 유니코드 문자열을 UTF8 문자열로 변환해 주는 다음 함수를 실행하면, 리턴되는 UTF8 버퍼에 아무런 값도 리턴 되지 않습니다. RFC2044에 명시된 스펙에 의거하여 문자열 변환하는 방법을 소개합니다.

#include “winnls.h”
WideCharToMultiByte(CP_UTF8, 0, szUniBuf, nUniLen, szUTFBuf, sizeof(szUTFBuf), NULL, NULL);

[추가 정보]

한글 윈도우 95에서 WIN32 API인 WideCharToMultiByte(CP_UTF8, xxx) 함수에서 UTF8 버퍼에 아무런 값도 리턴하지 않으므로 다음과 같이 스펙에 의거한 변환 루틴을 이용하여 UTF8 문자열 값을 얻습니다.

char* UnicodeToUTF8(wchar_t uc, char* UTF8)
{
if (uc <= 0x7f)
{
UTF8[0] = (char) uc;
UTF8[1] = (char) '\0';
}
else if (uc <= 0x7ff)
{
UTF8[0] = (char) 0xc0 + uc / (wchar_t) pow(2, 6);
UTF8[1] = (char) 0x80 + uc % (wchar_t) pow(2, 6);
UTF8[2] = (char) '\0';
}
else if (uc <= 0xffff)
{
UTF8[0] = (char) 0xe0 + uc / (wchar_t) pow(2, 12);
UTF8[1] = (char) 0x80 + uc / (wchar_t) pow(2, 6) % (wchar_t) pow(2, 6);
UTF8[2] = (char) 0x80 + uc % (wchar_t) pow(2, 6);
UTF8[3] = (char) '\0';
}

return UTF8;
}

int WideStrToUTF8Str(wchar_t *szUni,char *szUTF8)
{
int i=0;
char TempUTF8[10];
for(i=0;szUni[i];i++) {
UnicodeToUTF8(szUni[i], TempUTF8);
strcat(szUTF8, TempUTF8);
}
return strlen(szUTF8);
}

실제 위 두 함수를 사용하는 예제

{
wchar_t szUniBuf[MAXBUF];
int nUniLen, nUTFLen;
char szUTFBuf[MAXBUF];

nUniLen = MultiByteToWideChar(CP_ACP, 0, szHello, strlen(szHello), szUniBuf, MAXBUF);
szUniBuf[nUniLen] = 0;
memset(szUTFBuf, 0, MAXBUF);
nUTFLen = WideStrToUTF8Str(szUniBuf, szUTFBuf);
//nUTFLen = WideCharToMultiByte(CP_UTF8, 0, szUniBuf, nUniLen, szUTFBuf, MAXBUF, NULL, NULL);
szUTFBuf[nUTFLen]=0x00;

}


한글 EBCIDIC 코드를 한글 ASCII 코드로 변환하는 방법

KB Article ID: K001143

--------------------------------------------------------------------------------

[요 약]

프로그래밍적으로, 한글 EBCIDIC 코드를 한글 ASCII 코드로 변환하는 방법을
여기에서 소개한다.

[추가 정보]

#include 'snanls.h'
function()
{
int ret;
LPCTSTR lpSrcStr, lpDestStr;
ret =SnaInit(CP_949);
printf('ret = %d', ret);
ret = SnaNlsMapString (lpSrcStr, lpDestStr, CP_933, CP_949, 2, 2,
SNA_MULTIBYTE, SNA_MULTIBYTE, 0x0);
printf('ret = %d', ret);
}


1. SnaInit(CP_949)는 현재 이 프로그램이 실행되는 환경의 코드 페이지를
지정한다.
2. lpSrcStr은 IBM 메인 프레임 컴퓨터 등으로부터 받은 한글 EBCIDIC 코드이며,
lpDestStr은 리턴되는 ASCII 코드값이다.
3. #define CP_933 933 /* EBCDIC Korean */
#define CP_949 949 /* Korean */
UTF-8 to Unicode / Unicode to UTF-8 transformation

Posted by SB패밀리

Written by 안재우(Jaewoo Ahn), 닷넷엑스퍼트(.netXpert)

 

ASP 등으로 되어 있는 이전 사이트들을 .NET으로 마이그레이션하다가 한번씩 겪는 문제점 중 하나는 그놈의 지긋지긋한 한글 인코딩 문제입니다.

 

그 유명한 베스트셀러(?)인 '조엘 온 소프트웨어'에서도 이러한 인코딩 문제에 대해 언급을 하고 있습니다. 미국애들 중에 몇몇이 여전히 ASCII를 쓰는 것처럼, 우리나라 개발자들 역시 여전히 KSC-5601이나 ECU-KR 인코딩을 고집하는 사람들이 많습니다.

 

심지어 일반 사용자들마저도 한글 인코딩과 관련된 문제를 겪어보지 않은 사람들이 없을 것입니다. 가장 대표적인 사례로, 페이지의 이미지가 보이지 않는 일은 누구나 겪어 봤을 것입니다. 실제 이미지가 없는 경우는 제외하고, 이 문제의 원인 중 99%는 이미지 파일 이름이 한글로 되어 있는 경우입니다.

대부분의 사이트 또는 지식검색 등에서는 IE의 옵션에서 URL을 항상 UTF-8로 보냄이라는 옵션을 꺼서 해결하라고 말하곤 합니다. 문제는 이것이 근본적인 해결책은 아니며, 한글 인코딩 문제의 해결을 더더욱 멀게 만드는 장벽이 된다는 것입니다.

 

잠깐 빗나갔는데 다시 개발에 대해서 초점을 맞춰서 다시 얘기해보겠습니다.

일반적으로 한글 인코딩과 관련된 문제가 말썽을 부릴 소지가 있는 경우는 다음과 같습니다.

1. 웹 페이지의 한글 컨텐츠가 KSC-5601이나 EUC-KR로 되어 있는 경우

2. 브라우저에서 호출하는 URL에 한글이 포함되어 있는 경우

3. 데이터베이스에서 한글 인코딩이 UTF-8이 아닌 다른 것으로 지정되어 있는 경우

 

먼저 1번의 경우..

근본적인 문제가 생기는 원인은 ASP.NET을 비롯하여 .NET에서는 기본 인코딩이 UTF-8인 것부터 출발합니다. 그러므로 예를 들어, 웹 페이지의 한글 컨텐츠가 KSC-5601이나 EUC-KR로 되어 있는 경우, 인코딩이 깨지게 되는 것입니다.

물론 이 문제의 잘못이 무조건 개발자에게만 있느냐하면, 절대 그렇지는 않습니다. 일반적으로 웹 페이지를 디자인하는 것은 웹 디자이너들의 몫이며, 이 디자이너들이 페이지를 디자인할 때 KSC-5601이나 EUC-KR을 사용해서 작성해버리는 경우가 대다수입니다.

또, 종종 개발자를 당혹스럽게 하는 것 중 하는 .inc나 .js를 통해 include한 파일의 경우입니다. 아무 이상 없이 잘 돌던 .js였는데, 단지 ASPX 내에 붙여 넣었다는 이유만으로 스크립트 에러가 발생합니다. 이러한 경우, 역시 십중팔구는 스크립트 파일 내에 한글이 포함되어 있는 경우입니다.

 

일단 이 문제를 해결할 수 있는 방법은..

각 페이지의 meta 태그 등에서 charset을 지정해주거나,

web.config에서 다음과 같이 인코딩을 지정해주는 방법이 있습니다.

 

<configuration>
   <system.web>
      <globalization
         requestEncoding="ksc5601-1987"
         responseEncoding="ksc5601-1987"
         fileEncoding="ksc5601-1987"/>
   </system.web>
</configuration>

그런데, 이렇게 하면 정말 해결이 된 것일까요?

역시 이것 역시 임시적인 해결책에 지나지 않습니다.

더이상 인코딩 문제를 겪지 않으려면, UTF-8을 쓰는 것이 확실한 답입니다.

그러므로 바람직한 방법은 설사 디자이너가 다른 인코딩으로 전달을 해왔다고 하더라도, 메모장 등을 통해서 UTF-8로 변환해서 저장하는 것입니다. 스크립트 파일들 역시 메모장에서 연 다음 UTF-8로 변환해서 저장합니다.

 

2번의 경우.. 한글이 포함된 URL의 경우, 올바른 전송을 위해서는 한글을 URL에 맞게 인코딩을 수행해야 합니다.

 

예를 들어..

http://search.naver.com/search.naver?where=nexearch&query=한글인코딩&frm=t1

이 아니라..

http://search.naver.com/search.naver?where=nexearch&query=%C7%D1%B1%DB%C0%CE%C4%DA%B5%F9&frm=t1

가 되어야 한다는 것입니다.

(물론 네이버는 euc-kr 인코딩을 쓰고 있긴 합니다. -_-;;)

 

.NET의 경우..

문자열을 신뢰할 수 있는 URL 문자열로 만들기 위해 두 개의 메서드를 제공합니다.

HttpServerUtility.UrlEncode

HttpUtility.UrlEncode

 

이와는 반대로 다시 디코딩해서 원래의 문자로 돌리도록 다음 메서드들도 제공됩니다.

HttpServerUtility.UrlDecode

HttpUtility.UrlDecode

 

결국 Response 시에는 UrlEncode를 사용해서 인코딩을 하고, Request 받은 것을 처리할 때는 다시 UrlDecode를 사용해서 디코딩을 하는 형태로 해결을 하면 됩니다.

 

물론 이러한 부분을 처리하는데는 개발자의 귀차니즘이 수반되게 됩니다. 그 귀차니즘 덕분에 수많은 사용자들이 URL을 항상 UTF-8로 전송 옵션을 꺼야 합니다.

 

3번의 경우.. SQL 서버에서보다는 Oracle에서 많이 볼 수 있는 경우입니다.

상당수 Oracle 데이터베이스가 UTF-8이 아닌.. 심지어 US-ASCII7을 사용하는 경우가 있습니다.

대표적인 경우가 회사 내부에서 SAP을 사용하는 경우인데, 제가 알고 있기론 SAP 설치 시 기본 인코딩이 US-ASCII7인 걸로 압니다.

그래서 어떤 문제가 생기느냐? .NET에서 Oracle에 연결하기 위한 프로바이더로 ODP.NET이라는 놈이 있습니다. 이놈은 .NET이 붙은 넘 답게.. UTF-8을 사용합니다.

고로 ODP.NET을 사용하여 데이터베이스 인코딩이 US-ASCII7로 지정된 DB에서 한글 데이터를 읽으면 한글이 깨져버리는 사태가 발생하게 됩니다.

이에 대한 해결책은 DB 서버의 인코딩을 바꿔주거나, 쿼리에서 일일이 Encode 메서드를 사용해서 UTF-8로 변환하거나, 받은 후 애플리케이션 코드에서 인코딩을 변환시켜주는 수 밖에 없다는 것입니다. 어느 것 하나 쉬운게 없는데, 이러한 고생을 하는 이유가 한글 인코딩에 대해 무지했던 과거의 개발자/시스템 관리자들이 저질러 놓은 사고입니다.

 

사실 가장 이상적인 것은 Windows에서 인코딩을 UTF-8만 사용하도록 해버리면 확실한 해결책이 될지도 모릅니다. 대신 언젠가 만약 그런 날이 온다면, 기존의 UTF-8을 사용하지 않은 웹 사이트들은 문제가 생기게 되겠죠.

그러나, UTF-8이 표준화되었으므로 언젠가는 정말로 그런 날이 올지도 모릅니다. 그런 날이 오지 않기를 빌면서 통일을 반대하는 것보다는 하나씩 하나씩 바꿔 나가야 하지 않을까 합니다.

 

제발 이제는.. UTF-8을 쓰세요

Posted by SB패밀리

출처 : http://www.hoonsbara.com/hoonsboard.aspx?table_name=asptip&board_idx=447451&page=4&keyword=&search=&boardmode=2

 protected string Base64Encode(string str)
{
  return Convert.ToBase64String(
    System.Text.Encoding.GetEncoding("euc-kr").GetBytes(str)); 
}

protected string Base64Decode(string str)
{
  return System.Text.Encoding.GetEncoding("euc-kr").GetString(
    System.Convert.FromBase64String(str));
}

void Page_Load(Object src, EventArgs e )
{
  string str="인코딩할 한글 1234567890!@#$%^&*()";
  Response.Write( "인코딩 전 : " + str +"<br>" );
  string encoded = Base64Encode(str);
  Response.Write( "BASE64 인코드 : " + encoded +"<br>");
  string decoded = Base64Decode(encoded);
  Response.Write( "BASE64 디코드 : " + decoded +"<br>");
}

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

 

출처 : MSDN 2003

 

public void EncodeWithString() {
    System.IO.FileStream inFile;    
    byte[]                 binaryData;

    try {
        inFile = new System.IO.FileStream(inputFileName,
                                          System.IO.FileMode.Open,
                                          System.IO.FileAccess.Read);
        binaryData = new Byte[inFile.Length];
        long bytesRead = inFile.Read(binaryData, 0,
                                    (int)inFile.Length);
        inFile.Close();
    }
    catch (System.Exception exp) {
        // Error creating stream or reading from it.
        System.Console.WriteLine("{0}", exp.Message);
        return;
    }

    // Convert the binary input into Base64 UUEncoded output.
    string base64String;
    try {
         base64String =
            System.Convert.ToBase64String(binaryData,
                                          0,
                                          binaryData.Length);
    }
    catch (System.ArgumentNullException) {
        System.Console.WriteLine("Binary data array is null.");
        return;
    }

    // Write the UUEncoded version to the output file.
    System.IO.StreamWriter outFile;
    try {
        outFile = new System.IO.StreamWriter(outputFileName,
                                    false,
                                    System.Text.Encoding.ASCII);            
        outFile.Write(base64String);
        outFile.Close();
    }
    catch (System.Exception exp) {
        // Error creating stream or writing to it.
        System.Console.WriteLine("{0}", exp.Message);
    }
}

 
Posted by SB패밀리