| iconv() 함수를 이용하여 한글 쪼개기 | 작성일 : 2003/12/26 18:43 |
| 조회수 : 8876 |
|
소스자체 -> http://why-not.193d.com/ptext/test.php (사라졌음 -_-) 간단한 메모장 -> http://chak-yi.net/ ----------------------------- <?php $jamo = array( /*0 1 2 3 4 5 6 7 8 9 */ "ㄱ", "ㄲ", "ㄳ", "ㄴ", "ㄵ", "ㄶ", "ㄷ", "ㄸ", "ㄹ", "ㄺ", /* 0~9 */ "ㄻ", "ㄼ", "ㄽ", "ㄾ", "ㄿ", "ㅀ", "ㅁ", "ㅂ", "ㅃ", "ㅄ", /* 10~19 */ "ㅅ", "ㅆ", "ㅇ", "ㅈ", "ㅉ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ", /* 20~29 */ "ㅏ", "ㅐ", "ㅑ", "ㅒ", "ㅓ", "ㅔ", "ㅕ", "ㅖ", "ㅗ", "ㅘ", /* 30~39 */ "ㅙ", "ㅚ", "ㅛ", "ㅜ", "ㅝ", "ㅞ", "ㅟ", "ㅠ", "ㅡ", "ㅢ", /* 40~49 */ "ㅣ", " "); /* 50~51 */ $jo['cho'] = array( 51, 51, /* ㄱ ㄲ ㄴ ㄷ ㄸ ㄹ ㅁ ㅂ ㅃ ㅅ */ 0, 1, 3, 6, 7, 8,16,17,18,20, /* ㅆ ㅇ ㅈ ㅉ ㅊ ㅋ ㅌ ㅍ ㅎ */ 21,22,23,24,25,26,27,28,29 ); $jo['jung'] = array( 51, 51, 51, /* ㅏ ㅐ ㅑ ㅒ ㅓ */ 30,31,32,33,34, 51,51, /* ㅔ ㅕ ㅖ ㅗ ㅘ ㅙ */ 35,36,37,38,39,40, 51,51, /* ㅚ ㅛ ㅜ ㅝ ㅞ ㅟ */ 41,42,43,44,45,46, 51,51, /* ㅠ ㅡ ㅢ ㅣ */ 47,48,49,50 ); $jung_div = array( 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, //ㅗ, 0//ㅗ 38 30, //ㅗ, ㅏ, 1//ㅘ 39 31, //ㅗ, ㅐ, 2//ㅙ 40 51, 51, 50, //ㅗ, ㅣ, 3//ㅚ 41 51, //ㅛ, 4//ㅛ 42 51, //ㅜ, 5//ㅜ 43 34, //ㅜ, ㅓ, 6//ㅝ 44 35, //ㅜ, ㅔ, 7//ㅞ 45 50, //ㅜ, ㅣ, 8//ㅟ 46 51, 51, 51, //ㅠ, 9//ㅠ 47 51, //ㅡ, 10//ㅡ 48 50, //ㅡ, ㅣ 11//ㅢ 49 ); $jo['jong'] = array( 51,51, /* ㄱ ㄲ ㄳ ㄴ ㄵ ㄶ ㄷ ㄹ ㄺ ㄻ */ 0, 1, 2, 3, 4, 5, 6, 8, 9,10, /* ㄼ ㄽ ㄾ ㄿ ㅀ ㅁ */ 11,12,13,14,15,16, 51, /* ㅂ ㅄ ㅅ ㅆ ㅇ ㅈ ㅊ ㅋ ㅌ ㅍ */ 17,19,20,21,22,23,25,26,27,28, /* ㅎ */ 29, ); function font($text, $max) { global $jamo, $jo, $jung_div; $jcode = w2j($text); for($i=0, $line=0, $line_chk=0; $i < strlen($jcode); $i++) { if( ord($jcode[$i]) < 128 ) { /* 한글이나 2바이트 문자가 아니면.. */ if( ord($jcode[$i]) == 32 ) { $str[$line][0] .= " "; $str[$line][1] .= " "; $line_chk += 2; } else if( ord($jcode[$i]) == 13 && ord($jcode[$i+1]) == 10 ) { $i++; $line++; $line_chk=0; } else if( ord($jcode[$i]) > 32 ) { $str[$line][0] .= sprintf("%c", ord($jcode[$i])); $str[$line][1] .= " "; $line_chk++; } } else { $cho = ( ord($jcode[$i]) & 0x7c ) >> 2; $jung = ( (ord($jcode[$i]) & 0x3 ) << 3 ) | ( (ord($jcode[$i+1]) & 0xe0 ) >> 5 ); $jong = ord($jcode[$i+1]) & 0x1f ; if( is_han($cho, $jung, $jong) ) { /* 한글이 맞다! */ /* printf("%s%s%s ", $jamo[$jo['cho'][$cho]], $jamo[$jo['jung'][$jung]], $jamo[$jo['jong'][$jong]] ); */ $is_one = 0; /* '과' -> '고ㅏ' 로 분리 할 때 '고' 만들기 위해 임시 중성 값 'ㅗ' 저장용 */ $jung_tmp = 0; if( $jung >= 13 && $jung <= 28 ) { /* ㅗ, ㅘ, ㅜ, ㅟ.. 같이 중성이 초성과 종성 가운데 (공, 광) 들어갈 경우.. */ switch($jung) { /* 단모음일 경우 $is_one 셋팅 */ case 13 : $is_one = 1; /* ㅗㅘㅙㅚ-> ㅗ */ case 14 : case 15 : case 18 : $jung_tmp = 13; break; case 19 : $is_one = 1; /* ㅛ */ $jung_tmp = 19; break; case 20 : $is_one = 1; /* ㅜㅝㅞㅟ-> ㅜ */ case 21 : case 22 : case 23 : $jung_tmp = 20; break; case 26 : $is_one = 1; /* ㅠ */ $jung_tmp = 26; break; case 27 : $is_one = 1; /* ㅡㅢ-> ㅡ */ case 28 : $jung_tmp = 27; break; } $tmp = 1 + ( $jung_tmp << 5 ) | 0x8000 | $cho << 10; $str[$line][0] .= j2w(chr($tmp>>8) . chr($tmp)); } else { $str[$line][0] .= $jamo[$jo['cho'][$cho]]; } if( !$is_one ) { $str[$line][0] .= $jamo[$jung_tmp ? $jung_div[$jung] : $jo['jung'][$jung]] . " "; $str[$line][1] .= " "; $line_chk += 2; } else $str[$line][0] .= " "; $str[$line][1] .= $jamo[$jo['jong'][$jong]] . " "; $line_chk += 2; } else { /* 한글이 아니네.. iconv를 이용해서 완성형을 조합형으로 바꾸? 한글을 제외한 2바이트 문자들도 바뀌니깐! 한글을 제외한 2바이트 문자들은 다시 완성형으로! */ $str[$line][0] .= j2w(sprintf("%c%c", ord($jcode[$i]), ord($jcode[$i+1]))); $str[$line][1] .= " "; $line_chk += 2; } $i++; } if($line_chk >= $max) { $line++; $line_chk = 0; } } for($i=0; $i <= $line; $i++) { if( $i != 0 ) $ret .= "<br>\n"; $ret .= $str[$i][0] . "<br>\n" . $str[$i][1]; } return $ret; } /* ------------------------ 함수 정의 ------------------------ */ /* 변환된 조합형 코드가 한글인지 아닌지 */ function is_han($cho, $jung, $jong) { return ( ( $cho > 0 && $cho < 21 ) /* 초성 1~20 */ && ( ( $jung > 1 && $jung < 8 ) || /* 중성 2~7 */ ( $jung > 9 && $jung < 16 ) || /* 중성 10~15 */ ( $jung > 17 && $jung < 24 ) || /* 중성 18~23 */ ( $jung > 25 && $jung < 30 ) /* 중성 26~29 */ ) && ( ( $jong > 0 && $jong < 18 ) || /* 종성 1~17 */ ( $jong > 18 && $jong < 30 ) /* 종성 19~29 */ ) ) ? 1 : 0; } /* 완성형을 조합형으로 */ function w2j($text) { return iconv("cp949","johab",$text); } /* 조합형을 완성형으로 */ function j2w($text) { return iconv("johab","cp949",$text); } echo font("와우! 안녕하세요, 반갑습니다! 뷁꿐퉾펤", 50); ?> |
|||||||||
|
|