"PHP 한글 초성, 중성, 종성 분리 linear hangul()"의 두 판 사이의 차이

 
5번째 줄: 5번째 줄:
==소스 코드==
==소스 코드==
<syntaxhighlight lang='php' run>
<syntaxhighlight lang='php' run>
function utf8_strlen($str) { return mb_strlen($str, 'UTF-8'); }
function ord8($c) {
function utf8_charAt($str, $num) { return mb_substr($str, $num, 1, 'UTF-8'); }
function utf8_ord($c) {
$len = strlen($c);
$len = strlen($c);
if($len <= 0) return false;
if($len <= 0) return false;
24번째 줄: 22번째 줄:
$jong = ['','ㄱ','ㄲ','ㄳ','ㄴ','ㄵ','ㄶ','ㄷ','ㄹ','ㄺ','ㄻ','ㄼ','ㄽ','ㄾ','ㄿ','ㅀ','ㅁ','ㅂ','ㅄ','ㅅ','ㅆ','ㅇ','ㅈ','ㅊ','ㅋ',' ㅌ','ㅍ','ㅎ'];
$jong = ['','ㄱ','ㄲ','ㄳ','ㄴ','ㄵ','ㄶ','ㄷ','ㄹ','ㄺ','ㄻ','ㄼ','ㄽ','ㄾ','ㄿ','ㅀ','ㅁ','ㅂ','ㅄ','ㅅ','ㅆ','ㅇ','ㅈ','ㅊ','ㅋ',' ㅌ','ㅍ','ㅎ'];
$result = '';
$result = '';
for ($i=0; $i<utf8_strlen($str); $i++) {
for ($i=0; $i<mb_strlen($str, 'UTF-8'); $i++) {
$code = utf8_ord(utf8_charAt($str, $i)) - 44032;
$code = ord8(mb_substr($str, $i, 1, 'UTF-8')) - 44032;
if ($code > -1 && $code < 11172) {
if ($code > -1 && $code < 11172) {
$cho_idx = $code / 588;
$cho_idx = $code / 588;
32번째 줄: 30번째 줄:
$result .= $cho[$cho_idx].$jung[$jung_idx].$jong[$jong_idx];
$result .= $cho[$cho_idx].$jung[$jung_idx].$jong[$jong_idx];
} else {
} else {
$result .= utf8_charAt($str, $i);
$result .= mb_substr($str, $i, 1, 'UTF-8');
}
}
}
}

2021년 7월 31일 (토) 23:20 기준 최신판

PHP 함수 linear_hangul()
PHP 한글 초성, 중성, 종성 분리하기
PHP 한글 풀어쓰기 함수

1 소스 코드[ | ]

function ord8($c) {
	$len = strlen($c);
	if($len <= 0) return false;
	$h = ord($c[0]);
	if ($h <= 0x7F) return $h;
	if ($h < 0xC2) return false;
	if ($h <= 0xDF && $len>1) return ($h & 0x1F) <<  6 | (ord($c[1]) & 0x3F);
	if ($h <= 0xEF && $len>2) return ($h & 0x0F) << 12 | (ord($c[1]) & 0x3F) <<  6 | (ord($c[2]) & 0x3F);		  
	if ($h <= 0xF4 && $len>3) return ($h & 0x0F) << 18 | (ord($c[1]) & 0x3F) << 12 | (ord($c[2]) & 0x3F) << 6 | (ord($c[3]) & 0x3F);
	return false;
}

function linear_hangul($str) {
	$cho = ['ㄱ','ㄲ','ㄴ','ㄷ','ㄸ','ㄹ','ㅁ','ㅂ','ㅃ','ㅅ','ㅆ','ㅇ','ㅈ','ㅉ','ㅊ','ㅋ','ㅌ','ㅍ','ㅎ'];
	$jung = ['ㅏ','ㅐ','ㅑ','ㅒ','ㅓ','ㅔ','ㅕ','ㅖ','ㅗ','ㅘ','ㅙ','ㅚ','ㅛ','ㅜ','ㅝ','ㅞ','ㅟ','ㅠ','ㅡ','ㅢ','ㅣ'];
	$jong = ['','ㄱ','ㄲ','ㄳ','ㄴ','ㄵ','ㄶ','ㄷ','ㄹ','ㄺ','ㄻ','ㄼ','ㄽ','ㄾ','ㄿ','ㅀ','ㅁ','ㅂ','ㅄ','ㅅ','ㅆ','ㅇ','ㅈ','ㅊ','ㅋ',' ㅌ','ㅍ','ㅎ'];
	$result = '';
	for ($i=0; $i<mb_strlen($str, 'UTF-8'); $i++) {
		$code = ord8(mb_substr($str, $i, 1, 'UTF-8')) - 44032;
		if ($code > -1 && $code < 11172) {
			$cho_idx = $code / 588;
			$jung_idx = $code % 588 / 28;
			$jong_idx = $code % 28;
			$result .= $cho[$cho_idx].$jung[$jung_idx].$jong[$jong_idx];
		} else {
			$result .= mb_substr($str, $i, 1, 'UTF-8');
		}
	}
	return $result;
}

var_dump( linear_hangul('안녕하세요') );

2 같이 보기[ | ]

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}