인터넷에 퍼져있는 유니코드와 관련된 정보를 모아다가 짜집기로 만든거라, 허접할 수 있음을 미리 공지합니다. ^^;;
일단 작동방식은 [알쯔's 외부기억장치(http://blog.arzz.com)](UTF-8)과 같은 문장을 함수에 넣으면 [ㅇㅏㄹㅉㅡ'sㅇㅚㅂㅜㄱㅣㅇㅓㄱㅈㅏㅇㅊㅣ(http://blog.arzz.com)] 와 같은 문자열을 반환합니다.
즉, 한글일 경우, 자음과 모음, 그리고 받침을 따로 분리하고, 한글외의 문자열은 그대로 반환하며, 띄워쓰기는 무시합니다.
띄워쓰기도 그대도 반환하실려면, 함수 제일 아래쪽의 $splitStr = str_replace(' ','',$splitStr); 부분을 지워주시면 됩니다.
<?php
function GetUtf8String($str) {
$arr_cho = array("ㄱ", "ㄲ", "ㄴ", "ㄷ", "ㄸ", "ㄹ", "ㅁ","ㅂ", "ㅃ", "ㅅ", "ㅆ", "ㅇ", "ㅈ", "ㅉ","ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ");
$arr_jung = array("ㅏ", "ㅐ", "ㅑ", "ㅒ", "ㅓ", "ㅔ", "ㅕ","ㅖ", "ㅗ", "ㅘ", "ㅙ", "ㅚ", "ㅛ", "ㅜ","ㅝ", "ㅞ", "ㅟ", "ㅠ", "ㅡ", "ㅢ", "ㅣ");
$arr_jong = array("", "ㄱ", "ㄲ", "ㄳ", "ㄴ", "ㄵ", "ㄶ","ㄷ", "ㄹ", "ㄺ", "ㄻ", "ㄼ", "ㄽ", "ㄾ","ㄿ", "ㅀ", "ㅁ", "ㅂ", "ㅄ", "ㅅ", "ㅆ","ㅇ", "ㅈ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ");
$unicode = array();
$values = array();
$lookingFor = 1;
for ($i=0, $loop=strlen($str);$i<$loop;$i++) {
$thisValue = ord($str[$i]);
if ($thisValue < 128) {
$unicode[] = $thisValue;
} else {
if (count($values) == 0) $lookingFor = $thisValue < 224 ? 2 : 3;
$values[] = $thisValue;
if (count($values) == $lookingFor) {
$number = $lookingFor == 3 ? (($values[0]%16)*4096)+(($values[1]%64)*64)+($values[2]%64) : (($values[0]%32)*64)+($values[1]%64);
$unicode[] = $number;
$values = array();
$lookingFor = 1;
}
}
}
$splitStr = '';
while (list($key,$code) = each($unicode)) {
if ($code >= 44032 && $code <= 55203) {
$temp = $code-44032;
$cho = (int)($temp/21/28);
$jung = (int)(($temp%(21*28)/28));
$jong = (int)($temp%28);
$splitStr.= $arr_cho[$cho].$arr_jung[$jung].$arr_jong[$jong];
} else {
$temp = array($unicode[$key]);
foreach ($temp as $ununicode) {
if ($ununicode < 128) {
$splitStr.= chr($ununicode);
} elseif ($ununicode < 2048) {
$splitStr.= chr(192+(($ununicode-($ununicode%64))/64));
$splitStr.= chr(128+($ununicode%64));
} else {
$splitStr.= chr(224+(($ununicode-($ununicode%4096))/4096));
$splitStr.= chr(128+((($ununicode%4096)-($ununicode%64))/64));
$splitStr.= chr(128+($ununicode%64));
}
}
}
}
$splitStr = str_replace(' ','',$splitStr);
return $splitStr;
}
// UTF-8 문자열 생성
$str = iconv('euc-kr','utf-8','알쯔\'s 외부기억장치');
echo GetUtf8String($str);
// return ㅇㅏㄹㅉㅡ'sㅇㅚㅂㅜㄱㅣㅇㅓㄱ ㅈㅏㅇㅊㅣ(http://blog.arzz.com)
?>'이럴땐, 이렇게! > 프로그래밍' 카테고리의 다른 글
| myEolin 추천/북마크 버튼 디자인 바꾸기 (15) | 2008/01/19 |
|---|---|
| 많이 쓰이는 CSS 핵 (12) | 2008/01/15 |
| UTF-8 기준, 한글을 초성,중성,종성으로 분리하기 (13) | 2006/02/04 |
| MySQL 튜닝 18 가지 (2) | 2006/01/25 |
| 태터툴즈 백업기능을 100% 믿지마세요. (13) | 2006/01/11 |
| 태터툴즈, 최근 코멘트(계층형코멘트)리스트 정리하기 (2) | 2005/09/11 |





댓글을 달아 주세요
와... 직접 만드신거군요 : )
2006/02/04 23:32대단하십니다 +_+ 고칠점은 모르겠지만, 잘쓰겠습니다 : )
^^;;
2006/02/05 01:23오락하느라고 메신져를 못봤네요 ㅠ_ㅠ
유용하게 사용하시길-
비밀댓글 입니다
2006/02/04 23:45감사합니다. :) ^^;;
2006/02/05 01:23알쯔님 함수 좋은데요. 만드신다고 수고하셨습니다.
2006/02/11 03:26오픈유어북에 만드신 함수 가져다 붙였는데 괜찮죠? ^^
그럼 항상 건강하시고 행복하세요!!!
넵- 가져가서 사용하라고 공개한것인데 안 괜찮을리가;; ^^;; 잘 사용해주시면 너무 감사하구요~
2006/02/13 13:11하울님도 건강하시고- 감기조심하세요 ^^;
먼저, 좋은 함수 만드느라 수고하셨구요
2006/02/17 10:42근데 공백을 반영하기 위해 공백제거 하는 부분을 주석처리하고 처리했는데 문제가 발생했습니다.
원단어의 띄어쓰기와 다르게 띄어쓰기 형태로 분리되더군요
"마 추섬의 비극" 이라는 단어를 분리했을때 초중성 분리는 잘 되는데 띄어쓰기가 "마 추섬 의 비극" 이런식으로 돼요
물론 대부분의 단어는 잘 되지만 이 단어뿐 아니라 다른 많은 단어들이 띄어쓰기가 다르게 돼요.. 왜그럴까요?
흠... 그부분에 대해서는 저도 잘 모르겠네요 :)
2006/02/24 03:50시간날때 한번더 뜯어봐야할듯 하네요 ㅠㅠ
아... 올블로그 딱지가 이럴 때 좋네요. ^^; '한글' 딱지를 붙여서 글을 하나 쓰고 링크를 따라오다 보게 됐습니다.
2006/02/22 13:58참고로, Ajax에서 다루신다면 자바스크립트로 직접 한글을 다루는게 짧은 코드로 처리가 가능해서 좋습니다. UTF-8이든 EUC-KR이든 가리지 않고 바로 유니코드를 뱉어 주더라구요. (http://tody.teoal.net/archives/119)
php로 해야한다면... MoniWiki에 비슷하게 구현이 되어 있을거 같네요.
딱지라고 하셔서 순간 무엇인가 했답니다... 태그를 말씀하신듯 하네요-
2006/02/24 03:52그리고 말씀해주신, 자바스크립트로 구현하는 부분... 좋은 공부가 되었구요.
이번같은 경우는, 한글분리가 목적이라기보단, DB에 커넥팅해서, 쿼리값을 받아오는게 목적이었다보니, 직접 DB에 접근할 수 있는 PHP로 하는게 나을듯 해서... ^^;;
공백반영시 위의 소스를 그대로 사용할 경우... "태양공원"님의 말씀처럼 몇몇 단어들이 공백오류를 일으키는데요... 받침"ㅁ"이 들어가는 단어들이 문제가 됩니다.
2006/09/01 20:11이유는 $arr_jong 배열의 "ㅁ"부분뒤에.. 공백이 하나 숨어 있습니다. 그걸 제거하시면 해결이 될껍니다. ^^
앗 감사합니다. + _+
2006/09/02 12:18수정해서 올려두어야겠네요~
감사합니다. 이걸보고 응용좀해봐야 겠습니다.
2006/12/08 13:39