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

[개발/VC++] URLEncode, URLDecode, 유니코드 변환 소스



[개발/VC++] URLEncode, URLDecode, UTF8 변환 소스


[유니코드 문자집합용]


CString Unicode_URLDecode( CString strEncodedText )
{
 CString strResult;
 wchar_t ch0, ch1, ch2;
 wchar_t wch;
 TCHAR tch;
 int i = 0;


 while( i<strEncodedText.GetLength() )
 {
  tch = strEncodedText.GetAt(i);
  
  if( tch != _T('%') )
  {
   // a character not encoded
   strResult += tch;
   i++;
  }
  else
  {
   // a character encoded !!
   ch0 = _tcstol( strEncodedText.Mid( i+1, 2 ), NULL, 16 );
   i += 3;


   if( ch0 < 0x80 )
    // 1 byte for UTF-8
    // 0xxx xxxx
    wch = ch0;
   else
   {
    if( strEncodedText.GetAt(i)!= _T('%') ) // Error!
     continue;


    ch1 = _tcstol( strEncodedText.Mid( i+1, 2 ), NULL, 16 );
    i += 3;


    if( ch0 < 0xe0 )
    {
     // 2 byte for UTF-8
     // 110x xxxx 10xx xxxx
     wch = ((ch0&0x1f)<<6)
      | (ch1&0x3f);
    }
    else
    {
     // 3 byte for UTF-8
     if( strEncodedText.GetAt(i)!= _T('%') ) // Error!
      continue;


     ch2 = _tcstol( strEncodedText.Mid( i+1, 2 ), NULL, 16 );
     i += 3;


     // 1110 xxxx 10xx xxxx 10xx xxxx
     wch = ((ch0&0x0f)<<12)
      | ((ch1&0x3f)<<6)
      | (ch2&0x3f);
    }
   }
   strResult += wch;
  }
 }


 return strResult;
}

 

-------------------------------------------------------------------------------------------
[멀티바이트 문자집합용]


inline BYTE CURLEncode::toHex(const BYTE &x) {
 return x > 9 ? x + 55: x + 48;
}


inline BYTE CURLEncode::toByte(const BYTE &x) {
 return x > 57? x - 55: x - 48;
}

CString CURLEncode::URLDecode(CString sIn)
{
    CString sOut;
    const int nLen = sIn.GetLength() + 1;
    register LPBYTE pOutTmp = NULL;
    LPBYTE pOutBuf = NULL;
    register LPBYTE pInTmp = NULL;
    LPBYTE pInBuf =(LPBYTE)sIn.GetBuffer(nLen);
    //alloc out buffer
    pOutBuf = (LPBYTE)sOut.GetBuffer(nLen);
    
    if(pOutBuf)
    {
        pInTmp   = pInBuf;
        pOutTmp = pOutBuf;
        // do encoding
        while (*pInTmp)
        {
            if('%'==*pInTmp)
            {
                pInTmp++;
                *pOutTmp++ = (toByte(*pInTmp)%16<<4) + toByte(*(pInTmp+1))%16;
                pInTmp++;
            }
            else if('+'==*pInTmp)
                *pOutTmp++ = ' ';
            else
                *pOutTmp++ = *pInTmp;
            pInTmp++;
        }
        *pOutTmp = '\0';
        sOut.ReleaseBuffer();
    }
    sIn.ReleaseBuffer();
    
    return sOut;
}


CString CURLEncode::URLEncode(CString sIn)
{
    CString sOut;
    const int nLen = sIn.GetLength() + 1;
    register LPBYTE pOutTmp = NULL;
    LPBYTE pOutBuf = NULL;
    register LPBYTE pInTmp = NULL;
    LPBYTE pInBuf =(LPBYTE)sIn.GetBuffer(nLen);
    //alloc out buffer
    pOutBuf = (LPBYTE)sOut.GetBuffer(nLen*3);
    
    if(pOutBuf)
    {
        pInTmp   = pInBuf;
        pOutTmp = pOutBuf;
        // do encoding
        while (*pInTmp)
        {
            if(isalnum(*pInTmp) || '-'==*pInTmp || '_'==*pInTmp || '.'==*pInTmp)
                *pOutTmp++ = *pInTmp;
            else if(isspace(*pInTmp))
                *pOutTmp++ = '+';
            else
            {
                *pOutTmp++ = '%';
                *pOutTmp++ = toHex(*pInTmp>>4);
                *pOutTmp++ = toHex(*pInTmp%16);
            }
            pInTmp++;
        }
        *pOutTmp = '\0';
        sOut.ReleaseBuffer();
    }
    sIn.ReleaseBuffer();
    
    return sOut;
}


 





Posted by SB패밀리

[개발/VC++] URLEncode, URLDecode, UTF8 변환 소스



아래 소스는 멀티바이트 문자집합 프로젝트 설정으로 작업해야 작동된다.

inline BYTE toHex(const BYTE &x)
{
       return x > 9 ? x + 55: x + 48;
}

CString URLEncode(CString sIn)
{
       CString sOut;
       const int nLen = sIn.GetLength() + 1;
       register LPBYTE pOutTmp = NULL;
       LPBYTE pOutBuf = NULL;
       register LPBYTE pInTmp = NULL;
       LPBYTE pInBuf =(LPBYTE)sIn.GetBuffer(nLen);
       BYTE b = 0;

       //alloc out buffer
       pOutBuf = (LPBYTE)sOut.GetBuffer(nLen*3 - 2);//new BYTE [nLen * 3];

       if(pOutBuf)
       {
             pInTmp   = pInBuf;
              pOutTmp = pOutBuf;

              // do encoding
              while (*pInTmp)
              {
                     if(isalnum(*pInTmp))
                            *pOutTmp++ = *pInTmp;
                     else
                            if(isspace(*pInTmp))
                                   *pOutTmp++ = '+';
                            else
                            {
                                   *pOutTmp++ = '%';
                                   *pOutTmp++ = toHex(*pInTmp>>4);
                                   *pOutTmp++ = toHex(*pInTmp%16);
                            }
                     pInTmp++;
              }
              *pOutTmp = '\0';
              //sOut=pOutBuf;
              //delete [] pOutBuf;
              sOut.ReleaseBuffer();
       }
       sIn.ReleaseBuffer();
       return sOut;
}


UrlDecode:
#define IsHexNum(c) ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f'))

CString Utf8ToStringT(LPSTR str)
{
    _ASSERT(str);
    USES_CONVERSION;
    WCHAR *buf;
    int length = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
    buf = new WCHAR[length+1];
    ZeroMemory(buf, (length+1) * sizeof(WCHAR));
    MultiByteToWideChar(CP_UTF8, 0, str, -1, buf, length);

    return (CString(W2T(buf)));
}

CString UrlDecode(LPCTSTR url)
{
    _ASSERT(url);
    USES_CONVERSION;
    LPSTR _url = T2A(const_cast<LPTSTR>(url));
    int i = 0;
    int length = (int)strlen(_url);
    CHAR *buf = new CHAR[length];
    ZeroMemory(buf, length);
    LPSTR p = buf;
    while(i < length)
    {
        if(i <= length -3 && _url[i] == '%' && IsHexNum(_url[i+1]) && IsHexNum(_url[i+2]))
        {
            sscanf(_url + i + 1, "%x", p++);
            i += 3;
        }
        else
        {
            *(p++) = _url[i++];
        }
    }
    return Utf8ToStringT(buf);
}








Posted by SB패밀리

[개발/PHP] web php unicode 문자열 urldecode

문자열 : %uXXXX


<?php

function decode_unicode_url($str)
{
  $res = '';

  $i = 0;
  $max = strlen($str) - 6;
  while ($i <= $max)
  {
    $character = $str[$i];
    if ($character == '%' && $str[$i + 1] == 'u')
    {
      $value = hexdec(substr($str, $i + 2, 4));
      $i += 6;

      if ($value < 0x0080) // 1 byte: 0xxxxxxx
        $character = chr($value);
      else if ($value < 0x0800) // 2 bytes: 110xxxxx 10xxxxxx
        $character =
            chr((($value & 0x07c0) >> 6) | 0xc0)
          . chr(($value & 0x3f) | 0x80);
      else // 3 bytes: 1110xxxx 10xxxxxx 10xxxxxx
        $character =
            chr((($value & 0xf000) >> 12) | 0xe0)
          . chr((($value & 0x0fc0) >> 6) | 0x80)
          . chr(($value & 0x3f) | 0x80);
    }
    else
      $i++;

    $res .= $character;
  }

  return $res . substr($str, $i);
}
?>

Simple test with japanese characters,
combined with urldecode:

<?php

$str = decode_unicode_url('%u65E5%u672C%u8A9E');
print(mb_convert_encoding(urldecode($str), "sjis", "euc-jp, utf-8, sjis") . '<br/>');
?>

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패밀리

[개발/VC++] URLEncode, URLDecode, UTF8 변환 소스


[유니코드 문자집합용]


CString Unicode_URLDecode( CString strEncodedText )
{
 CString strResult;
 wchar_t ch0, ch1, ch2;
 wchar_t wch;
 TCHAR tch;
 int i = 0;


 while( i<strEncodedText.GetLength() )
 {
  tch = strEncodedText.GetAt(i);
  
  if( tch != _T('%') )
  {
   // a character not encoded
   strResult += tch;
   i++;
  }
  else
  {
   // a character encoded !!
   ch0 = _tcstol( strEncodedText.Mid( i+1, 2 ), NULL, 16 );
   i += 3;


   if( ch0 < 0x80 )
    // 1 byte for UTF-8
    // 0xxx xxxx
    wch = ch0;
   else
   {
    if( strEncodedText.GetAt(i)!= _T('%') ) // Error!
     continue;


    ch1 = _tcstol( strEncodedText.Mid( i+1, 2 ), NULL, 16 );
    i += 3;


    if( ch0 < 0xe0 )
    {
     // 2 byte for UTF-8
     // 110x xxxx 10xx xxxx
     wch = ((ch0&0x1f)<<6)
      | (ch1&0x3f);
    }
    else
    {
     // 3 byte for UTF-8
     if( strEncodedText.GetAt(i)!= _T('%') ) // Error!
      continue;


     ch2 = _tcstol( strEncodedText.Mid( i+1, 2 ), NULL, 16 );
     i += 3;


     // 1110 xxxx 10xx xxxx 10xx xxxx
     wch = ((ch0&0x0f)<<12)
      | ((ch1&0x3f)<<6)
      | (ch2&0x3f);
    }
   }
   strResult += wch;
  }
 }


 return strResult;
}

 

-------------------------------------------------------------------------------------------
[멀티바이트 문자집합용]


inline BYTE CURLEncode::toHex(const BYTE &x) {
 return x > 9 ? x + 55: x + 48;
}


inline BYTE CURLEncode::toByte(const BYTE &x) {
 return x > 57? x - 55: x - 48;
}

CString CURLEncode::URLDecode(CString sIn)
{
    CString sOut;
    const int nLen = sIn.GetLength() + 1;
    register LPBYTE pOutTmp = NULL;
    LPBYTE pOutBuf = NULL;
    register LPBYTE pInTmp = NULL;
    LPBYTE pInBuf =(LPBYTE)sIn.GetBuffer(nLen);
    //alloc out buffer
    pOutBuf = (LPBYTE)sOut.GetBuffer(nLen);
   
    if(pOutBuf)
    {
        pInTmp   = pInBuf;
        pOutTmp = pOutBuf;
        // do encoding
        while (*pInTmp)
        {
            if('%'==*pInTmp)
            {
                pInTmp++;
                *pOutTmp++ = (toByte(*pInTmp)%16<<4) + toByte(*(pInTmp+1))%16;
                pInTmp++;
            }
            else if('+'==*pInTmp)
                *pOutTmp++ = ' ';
            else
                *pOutTmp++ = *pInTmp;
            pInTmp++;
        }
        *pOutTmp = '\0';
        sOut.ReleaseBuffer();
    }
    sIn.ReleaseBuffer();
   
    return sOut;
}


CString CURLEncode::URLEncode(CString sIn)
{
    CString sOut;
    const int nLen = sIn.GetLength() + 1;
    register LPBYTE pOutTmp = NULL;
    LPBYTE pOutBuf = NULL;
    register LPBYTE pInTmp = NULL;
    LPBYTE pInBuf =(LPBYTE)sIn.GetBuffer(nLen);
    //alloc out buffer
    pOutBuf = (LPBYTE)sOut.GetBuffer(nLen*3);
   
    if(pOutBuf)
    {
        pInTmp   = pInBuf;
        pOutTmp = pOutBuf;
        // do encoding
        while (*pInTmp)
        {
            if(isalnum(*pInTmp) || '-'==*pInTmp || '_'==*pInTmp || '.'==*pInTmp)
                *pOutTmp++ = *pInTmp;
            else if(isspace(*pInTmp))
                *pOutTmp++ = '+';
            else
            {
                *pOutTmp++ = '%';
                *pOutTmp++ = toHex(*pInTmp>>4);
                *pOutTmp++ = toHex(*pInTmp%16);
            }
            pInTmp++;
        }
        *pOutTmp = '\0';
        sOut.ReleaseBuffer();
    }
    sIn.ReleaseBuffer();
   
    return sOut;
}


 

Posted by SB패밀리

[개발/VC++] URLEncode, URLDecode, UTF8 변환 소스

아래 소스는 멀티바이트 문자집합 프로젝트 설정으로 작업해야 작동된다.

inline BYTE toHex(const BYTE &x)
{
       return x > 9 ? x + 55: x + 48;
}

CString URLEncode(CString sIn)
{
       CString sOut;
       const int nLen = sIn.GetLength() + 1;
       register LPBYTE pOutTmp = NULL;
       LPBYTE pOutBuf = NULL;
       register LPBYTE pInTmp = NULL;
       LPBYTE pInBuf =(LPBYTE)sIn.GetBuffer(nLen);
       BYTE b = 0;

       //alloc out buffer
       pOutBuf = (LPBYTE)sOut.GetBuffer(nLen*3 - 2);//new BYTE [nLen * 3];

       if(pOutBuf)
       {
             pInTmp   = pInBuf;
              pOutTmp = pOutBuf;

              // do encoding
              while (*pInTmp)
              {
                     if(isalnum(*pInTmp))
                            *pOutTmp++ = *pInTmp;
                     else
                            if(isspace(*pInTmp))
                                   *pOutTmp++ = '+';
                            else
                            {
                                   *pOutTmp++ = '%';
                                   *pOutTmp++ = toHex(*pInTmp>>4);
                                   *pOutTmp++ = toHex(*pInTmp%16);
                            }
                     pInTmp++;
              }
              *pOutTmp = '\0';
              //sOut=pOutBuf;
              //delete [] pOutBuf;
              sOut.ReleaseBuffer();
       }
       sIn.ReleaseBuffer();
       return sOut;
}


UrlDecode:
#define IsHexNum(c) ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f'))

CString Utf8ToStringT(LPSTR str)
{
    _ASSERT(str);
    USES_CONVERSION;
    WCHAR *buf;
    int length = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
    buf = new WCHAR[length+1];
    ZeroMemory(buf, (length+1) * sizeof(WCHAR));
    MultiByteToWideChar(CP_UTF8, 0, str, -1, buf, length);

    return (CString(W2T(buf)));
}

CString UrlDecode(LPCTSTR url)
{
    _ASSERT(url);
    USES_CONVERSION;
    LPSTR _url = T2A(const_cast<LPTSTR>(url));
    int i = 0;
    int length = (int)strlen(_url);
    CHAR *buf = new CHAR[length];
    ZeroMemory(buf, length);
    LPSTR p = buf;
    while(i < length)
    {
        if(i <= length -3 && _url[i] == '%' && IsHexNum(_url[i+1]) && IsHexNum(_url[i+2]))
        {
            sscanf(_url + i + 1, "%x", p++);
            i += 3;
        }
        else
        {
            *(p++) = _url[i++];
        }
    }
    return Utf8ToStringT(buf);
}


 

Posted by SB패밀리

WEB의 HTML, 자바스크립트로 Get 방식으로 한글 문자열을 넘겨줄 때 인코딩 문제를 해결해 봅니다.
asp.net 소스로 구현되어있습니다.

ASP.NET에서 GET방식을 이용해서 넘겨준 한글 문자열을 Request로 받을 때,
인코딩 문제로 한글이 깨져서 보입니다.

그럴때는 한글 문자열을 인코딩해서 보내고 받는 방법을 사용해야 합니다.
Server Script(서버 스크립트)를 사용해서 보낼 때 HttpUtility.UrlEncode(string) 메소드를 이용하시면 되고,
Javascript(자바스크립트)에서 바로 보낼 때 사용하시려면 escape(string) 함수를 이용하시면 됩니다.

[Server Script]

Response.Redirect("movepage.aspx?name=" + HttpUtility.UrlEncode("홍길동"))

[Javascript]

document.location.href = "movepage.aspx?name=" + escape("배철수");

그 외 ServerUtilty.UrlEncode, UrlHtmlEncode 등의 함수도 참고하십시오.
쌈꼬쪼려 소백촌닭

Posted by SB패밀리


이번 내용은 팁이라고 하기에는 좀 그렇고 제가 한참 고생하다 방법을 찾아서 너무 기쁜 나머지 여기에 올리게 되었습니다. ^^;;

대단한건 아니고 닷넷에서 파일 다운로드 구현할때 파일명에 한글이 있으면 다운로드 창에서 파일명이 깨져서 나오는 현상 해결 방법 입니다.

일단 소스를 보시면 다들 이해 하시리라 생각됩니다.



public static void FileDownload(string sFileName)
{
try
{
//파일 저장 경로
string sBoardDataPath = ConfigUtil.GetUploadRootPath() + "\\NB_BoardData_001001";

string sTmpFilePath = sBoardDataPath.Trim() + "\\" + sFileName.Trim();

//헤더에 파일 이름 지정
Response.ClearHeaders();
Response.ClearContent();

Response.ContentType = "multipart/form-data";
Response.AddHeader
("Content-Disposition", "attachment;filename=" + Server.UrlPathEncode(sFileName));
Response.WriteFile (sTmpFilePath);
Response.Flush();
Response.Close();
}
catch(Exception E)
{
throw E;
}
}






위 소스는 내보드에서 사용하는 파일 다운로드 함수를 약간 수정한 것 입니다.


위 소스에서 UrlPathEncode 이 부분이 한글 파일명을 안깨지고 보여지도록 하는 부분 입니다.


어딜 찾아보니 UrlEncode로 하면 된다고 하던데 안되더군요.

UrlEncode과 UrlPathEncode에 대한 자세한 설명은 다음 MSDN 페이지를 참조하시면 됩니다.

UrlEncode 설명
UrlPathEncode 설명

벌써 다들 알고있는 내용이었다면 대략낭패 ;;
Posted by SB패밀리

utf-8 방식을 추구하기 위해 원래는 코드비하인드에서 한글데이터값을 Server.UrlEncode 매서드를 사용해 인코딩해서 쿠키에 넣은후 자바스크립트에서 쿠키값을 읽어와 GET 방식으로 넘겨주려 했지만 GET방식으로 호출한 페이지에서 Server.UrlDecode 매서드를 사용해보았지만 한글데이터가 깨지는 이유로 부득이하게 Cookie가 아닌 Hidden 컨트롤을 사용하였다.

 web.config

utf-8 방식 사용

<globalization requestEncoding="utf-8" responseEncoding="utf-8" />


 

A.cs

Hidden 컨트롤에 인코딩된 데이터를 넣는다.

hidRName.Value = Server.UrlEncode(m_strRname);  <- UrlEncode 매서드를 사용하면 한글데이터를 스크립트단에서 이진데이터로 표시되게 해준다. UrlEncode  매서드를 사용하면 주소창에 한글데이터를 이진데이터로 표시해서 넘겨주는 장점이 있는것 같다.

 

A.aspx

Hidden 컨트롤값을 변수에 담는다.

var vR_NAME = document.getElementById("hidRName").value;

var avs_URL = "B.aspx?R_NAME=" + vR_NAME ;

 

B.aspx 호출

 

B.cs

TextBox 값에 넘어온 파라미터값 셋팅

txtRName.Value = Server.UrlDecode(Request["R_NAME"]);

이렇게하면 UTF-8 방식일경우 한글데이터를 넘겨받을수 있다.  ( txtRName.Value = Request["R_NAME"];  <- 이방법도 가능함. )


 

 

원래 시도하였던 방식의 자바스크립트에서 쿠키값 가져오는 함수. 좀더 보강하면 Cookie 를 사용하더라도 한글데이터가 깨지지않게 넘겨받을수 있을거 같다. (해결방법 : js 파일내에서 escape() 함수를 사용하면 된다)

// *****************************************************
// 내용 : 쿠키값 가져오기
// 작성일자 : 2007.11.29
// 작성자 : 한재준
// name : Cookie Name
// *****************************************************
function getCookie( name )
{
    var tempArr = document.cookie.split("&");
    var nameOfCookie = name + "=";
    var x = 0;
    var y = (nameOfCookie.length);
    var returnValue = "";
   
    for(var i=0; i<tempArr.length; i++)
    {
        if(tempArr[i].substring( x, y ) == nameOfCookie)
        {
            endOfCookie = tempArr[i].length;
            returnValue = unescape(tempArr[i].substring( y, endOfCookie));
            break;
        }
    }
   
    return returnValue;
}

  

Tip !

위와 같은방식으로 UrlEncode 매서드와 HtmlEncode 매서드의 차이점을 확인하기 위해서 HtmlEncode 매서드를 사용해봤으나( hidRName.Value = Server.HtmlEncode(m_strRname); )  B.cs 페이지에서  HtmlDecode 매서드를 사용해 넘어온 파라미터값을 디코딩해보았지만 한글데이터가 깨지는것을 확인하였다.
 결론은 utf-8 방식에서는 한글데이터를 GET 방식으로 넘겨줄때는 항상 UrlEncode 매서드를 사용해야 한다는 것이다

Posted by SB패밀리

펌 - 데브피아

 한글이 포함된 URL로 이동하기 위해 애쓴 경험이 있어 이렇게 써 봅니다.
허접하지만, 도움이 되었으면 하네요~ ^-^;

고민은 했었지만 의외로 쉽게 해결했습니다.

한글이 들어있는 부분만 인코딩 해서 HttpWebRequest 객체에 연결을 했죠.

그냥 전체 URL을 인코딩 한 후 연결할 경우 '.'과 '/' 때문에 예외가 발생하더군요.

 

예) http://www.test.com/test/test.aspx?param1=이름&param2=주소&param3=전화번호

string url = "http://www.test.com/test/test.aspx?param1=이름&param2=주소&param3=전화번호";

int p = url.IndexOf('?');

string url = url.SubString( 0, p );

url = url + System.Web.HttpUtility.UrlEncode( url.SubString(p+1), System.Text.Encoding.GetEncoding("ks_c_5601-1987") );

HttpWebRequest req = (HttpWebRequest)WebRequest.Create( url );

 

너무 간단하죠? ^-^;;;;;

더 좋은 방법이 있을것도 같습니다만, 일단은 저렇게 해서 해결을 봤습니다.

퇴근시간이 임박해서..

다음에 시간나면, Cookie값을 HttpWebRequest에 연결하는 방법을 써보겠습니다

Posted by SB패밀리

1. Get 방식

1) 작은 데이터를 전송하여 처리할 때 주로 사용(제한된 데이터양 ).
2) 브라우저 창에 해당 변수와 변수값을 출력.

 2. Post 방식

1) 입력값이 비교적 많은 데이터를 전송하고 처리할 때 사용(데이터에 제한이 없음).
2) 브라우저 창에 해당 변수와 변수값을 출력하지 않아, 보안적인 측면에서는 post 방식이 좀더 낫다고 할 수 있음. 


※ 주의

ASP.NET에서는 다른페이지로 GET방식을 이용해서 한글을 바로 넘겨 Request로 받으면 영문이나 숫자는 올바르게 보이지만 한글이 깨져서 보입니다. 

그럴때는 한글을 인코딩해서 넘기시는게 가장 간편한 방법입니다.
서버스크립트를 사용해서 넘길때는 HttpUtility.UrlEncode(string) 메소드를 이용하시면 되고,
자바스크립트에서 바로 넘겨서 사용하시려면 escape(string) 함수를 이용하시면 됩니다.

[Server Script]
Response.Redirect("GoodSite.aspx?name=" + HttpUtility.UrlEncode("다음"))

[Javascript]
location.href = "GoodSite.aspx?name=" + escape("다음포털");



Posted by SB패밀리