명

Charset Auto Detection(캐릭터셋 자동 감지)

명시적으로 캐릭터셋을 정하지 않는 상태에서
param 으로 넘어온값이나, 문자열의 charset을 검출해야 하는 경우가 있습니다.
흔하게 발생되는 경우는 아니지만, 외부 시스템 연동과 같은 특수상황에서는 종종 발생하는 케이스입니다.
자바쪽 자료를 찾다가 php 자료들도 보이길래 정리해봅니다.
자동검출이기 때문에 100% 완벽하지 않습니다.

1. mb_detect_encoding()
- http://kr.php.net/manual/en/function.mb-detect-encoding.php

2. 캐릭터셋의 바이트 구조를 분석하여 직접 코딩
- http://my.oops.org/62
<?php
//
// +----------------------------------------------------------------------+
// | PHP Version 4 |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2003 The PHP Group |
// +----------------------------------------------------------------------+
// | This source file is subject to version 2.02 of the PHP license, |
// | that is bundled with this package in the file LICENSE, and is |
// | available at through the world-wide-web at |
// | http://www.php.net/license/2_02.txt. |
// | If you did not receive a copy of the PHP license and are unable to |
// | obtain it through the world-wide-web, please send a note to |
// | [email protected] so we can mail you a copy immediately. |
// +----------------------------------------------------------------------+
// | Author: JoungKyun Kim <http://www.oops.org> |
// +----------------------------------------------------------------------+
//
// $Id: eSystem.php,v 1.2 2005/07/11 05:58:11 oops Exp $

require_once 'PEAR.php';

/**
* PEAR's eSystem:: interface. Defines the php extended system mapping function
* and any utility mapping function
*
* @access public
* @version $Revision: 0.1 $
* @package Unicode
*/
class Unicode extends PEAR
{
function chr2bin ($c, $shift = '') {
$c = ord ($c);

if ( $shift && preg_match ('/^([<>]+)[\s]*([0-9]+)/', $shift, $match) ) :
switch ($match[1]) :
case '>>' : $c = $c >> $match[2]; break;
case '<<' : $c = $c << $match[2]; break;
case '<' : $c = $c < $match[2]; break;
case '>' : $c = $c > $match[2]; break;
endswitch;
endif;

return decbin ($c);
}

function is_utf8 ($str) {
$_l = strlen ($str);
$_not = 0;

for ( $i=0; $i<$_l; $i++ ) :
#$_first = $this->chr2bin ($str[$i]);

# if 7bit charactior or numeric, skipped
#if ( strlen ($_first) != 8 )
# continue;

# if single byte charactors, skipped
if ( ! (ord ($str[$i]) & 0x80) ) :
continue;
endif;

$_first = $this->chr2bin ($str[$i], '>>4');

switch ( $_first ) :
case 1111 : $b = 3; break; # 4byte
case 1110 : $b = 2; break; # 3byte
default : return 0; # not utf8
endswitch;

for ( $j=1; $j<$b; $j++ ) :
if ( substr ($this->chr2bin ($str[$i+$j]), 0, 2) != 10 )
return 0;
endfor;

break;
endfor;

return $_not ? 0 : 1;
}
}

/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
* vim600: noet sw=4 ts=4 fdm=marker
* vim<600: noet sw=4 ts=4
*/
?>

사용예
<?
require_once 'Unicode.php';
$_f = 'usage_200509.html';
$_ff = 'bb.html';

$u = new Unicode;
if ( file_exists ($_ff) )
unlink ($_ff);

$_t = file ($_f);

foreach ( $_t as $_v ) :
$_v = trim ($_v);
if ( $u->is_utf8 ($_v) )
putfile_lib ($_ff, utf8decode_lib ($_v, 'cp949'), 1);
else
putfile_lib ($_ff, $_v, 1);
endforeach;

?>

그외 참고 url
http://my.oops.org/126<div class='small'>[이 게시물은 관리자님에 의해 2011-10-31 17:16:08 PHP & HTML에서 이동 됨]</div>
|

댓글 1개

내가 조아라 하는 pear소스네요...ㅎㅎ
댓글을 작성하시려면 로그인이 필요합니다.

프로그램

8,188건
+
제목 글쓴이 날짜 조회
11-10-25 조회 2,503
11-10-18 조회 4,033
11-10-18 조회 2,409
11-10-15 조회 3,635
11-10-10 조회 2,686
11-10-02 조회 2,597
11-09-28 조회 2,417
11-09-24 조회 2,509
11-09-22 조회 2,399
11-09-05 조회 2,882
11-08-31 조회 2,259
11-08-31 조회 2,579
11-08-31 조회 2,424
11-08-29 조회 2,972
11-08-28 조회 2,468
11-08-25 조회 2,527
11-08-17 조회 2,236
11-08-16 조회 2,474
11-08-11 조회 2,927
11-08-07 조회 2,639
11-08-03 조회 2,351
11-07-22 조회 2,094
11-07-12 조회 3,310
11-06-27 조회 2,091
11-06-01 조회 1,756
11-05-17 조회 2,545
11-05-01 조회 2,618
11-04-28 조회 2,903
11-04-28 조회 2,954
11-04-13 조회 2,614
11-03-27 조회 2,739
11-03-27 조회 2,614
11-03-14 조회 2,025
11-03-02 조회 2,351
11-03-02 조회 2,581
11-02-27 조회 3,007
11-02-23 조회 2,388
11-02-19 조회 2,528
11-02-14 조회 4,141
11-02-03 조회 2,933
11-01-24 조회 3,881
11-01-04 조회 2,408
10-12-08 조회 5,422
10-11-15 조회 2,429
10-11-14 조회 2,617
10-11-14 조회 3,631
10-10-29 조회 3,700
10-10-19 조회 2,710
10-10-07 조회 2,536
10-10-05 조회 4,452
10-09-18 조회 2,752
10-09-18 조회 2,494
10-09-17 조회 4,897
10-09-15 조회 2,836
10-09-15 조회 2,366
10-09-15 조회 2,855
10-09-15 조회 2,686
10-09-11 조회 4,012
10-09-11 조회 2,515
10-09-11 조회 2,556
10-09-07 조회 3,833
10-09-07 조회 3,368
10-08-29 조회 2,830
10-07-01 조회 3,075
10-06-30 조회 2,482
10-06-30 조회 2,658
10-06-30 조회 3,010
10-06-13 조회 2,051
10-04-15 조회 3,220
10-04-04 조회 3,450
10-02-23 조회 3,557
10-02-09 조회 3,154
10-01-25 조회 2,666
10-01-25 조회 2,759
09-12-27 조회 4,404
09-11-23 조회 3,630
09-11-20 조회 4,864
09-08-30 조회 3,059
09-08-30 조회 3,055
09-08-12 조회 3,028
09-07-22 조회 4,083
09-07-22 조회 4,733
09-07-15 조회 5,899
09-07-11 조회 2,975
09-06-17 조회 2,717
09-06-15 조회 3,008
09-05-29 조회 3,282
09-05-11 조회 5,919
09-05-08 조회 2,676
09-04-30 조회 3,793
09-04-17 조회 3,115
09-04-04 조회 3,302
09-03-05 조회 3,676
09-02-09 조회 3,652
09-02-03 조회 6,153
08-12-27 조회 3,217
08-12-20 조회 4,303
08-11-21 조회 5,266
08-11-14 조회 2,835
08-11-03 조회 3,297