YesYo.com MintState Forums
뒤로    YesYo.com MintState BBS > Tech > PHP
검색
멤버이름    오토
비밀번호 
 

문자셋(character set) 변환

페이지 정보

작성자 MintState 댓글 0건 조회 15,156회 작성일 08-11-03 10:34

본문

문자셋(character set) 변환

1. character set 정보는 어디서??
character set 의 배정은 IANA (Internet Assigned Numbers Authority)에서 합니다.
최신의 character-set 정보는 다음 주소에서 찾아보시구요.
http://www.iana.org/assignments/character-sets

2. character set 변환은 왜?
다국어 지원을 하는 경우에는 이 character set을 고려해야 하는 경우가 있습니다.
중국 시스템에서 한국 시스템으로 어떤 문자를 보내고자 할때,
보통 중국은 big5 인코딩 방식을 사용하고, 한국은 ksc_5601을 사용합니다.
big5로 인코딩되어 있는 문자(한자가 되겠죠?)를 ksc_5601에 맞춰서 출력하며
이상한 값이 출력되겠죠?

3. 변환 방법은?
각 인코딩 방식마다 저마다의 인코딩 룰이 있습니다. utf-8 에서 unicode(ucs-2)로
변환하는 경우, 두 인코딩 방식을 비교하여 변화하는 코드를 작성해야겠죠.
일일이 인코딩 방식을 봐가면서 하기에는 다소 무리가 있는듯 합니다.
그래서, 편하게 사용할 수 있는 방법이 unix 시스템의 경우,
iconv 라는게 있습니다.

4. iconv 사용법은?
- 명령어
  사용법 : iconv -f 원시코드 -t 목적코드 [파일...]
  console에서 직접 iconv 명령어를 사용하여 변환할 수 있습니다.

- iconv library 이용
  프로그램을 작성하는 경우, 라이브러리를 사용하시면 됩니다.
  libiconv.a
  * 컴파일시 -liconv 주어야 합니다.
  * iconv_open, iconv, iconv_close 등의 함수가 있습니다.
    자세한 사항은 iconv man page를 참조하세요
 
5. iconv를 통해 변화할 수 있는 character set 정보는 어디에?
시스템마다 조금씩 다릅니다.


* iconv man page



* PHP 에서의 변환
기본적으로 서버에서 iconv 함수를 지원한다면 @iconv함수를 이용하시면 됩니다.(iconv함수는 PHP 기본 함수가 아님니다)
하지만 지원하지 않는다면 위에서 소개한 콘솔을 이용하시면됩니다.

@iconv함수를 이용한 방법
euc-kr -> UTF-8
$str = @iconv("UHC","UTF-8",$str);

UTF-8 -> euc-kr
$str = @iconv("UTF-8","UHC",$str);

big5 -> UTF-8
$str = @iconv("big5","UTF-8",$str);


콘솔 iconv를 이용한 방법
   function euckr2utf8($str) { 
     $str = ereg_replace("\n","\\n",$str); 
     $str = exec('echo ''.$str.'' |iconv -c -f uhc -t utf-8'); 
     return ereg_replace("\\\\n","\n",$str); 
   } 

   function utf82euckr($str) { 
     $str = ereg_replace("\n","\\n",$str); 
     $str = exec('echo ''.$str.'' |iconv -c -f utf-8 -t uhc'); 
     return ereg_replace("\\\\n","\n",$str); 
   } 

euc-kr -> UTF-8
$str = euckr2utf8($str);

UTF-8 -> euc-kr
$str = utf82euckr($str)


* UTF-8 인지 확인하는 함수
   function isutf8($str) { 
     $i=0; 
     $len = strlen($str); 

     for ($i=0;$i<$len;$i++) { 
        $sbit = ord(substr($str,$i,1)); 
        if ($sbit < 128) { 
        } else if($sbit > 191 && $sbit < 224) { 
           $i++; 
        } else if($sbit > 223 && $sbit < 240) { 
           $i+=2; 
        } else if($sbit > 239 && $sbit < 248) { 
           $i+=3; 
        } else { 
           return 0; 
        } 
     } 
     return 1; 
   } 


ps. 위함수는 KEBIL이 작성하신것입니다.

* 자신의 호스팅 계정이 함수방법, 콘솔방법을 지원하는지 알아보기위한 소스
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>변환 방법 확인</title>
</head>
<body>
1. iconv() 함수 존재여부 확인<br />
Result: <?
$test2 = function_exists(iconv);
if($test2 == 1) echo "있음";
else echo "없음";
?><br /><br />

2. Consol iconv test<br />
Result: <?
$test =  exec('echo "112" |iconv -f euc-kr -t utf-8');
if($test=="112") echo "사용가용";
else echo "사용불가";
?><br /><br />
<?
if($test == 112 && $test2 ==1) {
	echo"방법1과 방법2를 사용할 수 있습니다.<br />방법1을 사용하는 것이 가장 쉽습니다.<br />단, 변환불가능한 문자(UTF-8에는 존재하지만, euc-kr에는 존재하지 않는 문자, 기호 등)가 있을 경우 변환 결과가 나오지 않을 수 있습니다. 그럴 경우에는 방법 2를 사용해 주세요.";
}
else if($test != 112 && $test2 ==0) { 
	echo"두 방법 모두 사용할 수 없습니다. 방법 3을 사용하세요.";
}
else if($test != 112 && $test2 ==1) {
	echo"방법1을 사용할 수 있습니다.";
}
else if($test == 112 && $test2 ==0) {
	echo "방법2를 사용할 수 있습니다.";
}
?>
</body>
</html>

댓글목록

등록된 댓글이 없습니다.

Total 165건 5 페이지
PHP 목록
번호 제목 글쓴이 조회 날짜
65 MintState 19195 11-03
64 MintState 26090 11-03
63 MintState 12708 11-03
62 MintState 18589 11-03
61 MintState 20549 11-03
열람중 MintState 15157 11-03
59 MintState 14291 11-03
58 MintState 11897 11-03
57 MintState 12198 11-03
56 MintState 18183 11-03
55 MintState 14962 11-03
54 MintState 16082 11-03
53 MintState 16898 11-03
52 MintState 12370 11-03
51 MintState 12249 11-03
50 MintState 12951 11-03
49 MintState 13094 11-03
48 MintState 14287 11-03
47 MintState 13414 11-03
46 MintState 13445 11-03
45 MintState 14335 10-31
44 MintState 12191 10-31
43 MintState 12528 10-31
42 MintState 14973 10-31
41 MintState 10721 10-31
게시물 검색
모바일 버전으로 보기
CopyRight ©2004 - 2024, YesYo.com MintState. ™