명

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,498
11-10-18 조회 4,025
11-10-18 조회 2,403
11-10-15 조회 3,630
11-10-10 조회 2,678
11-10-02 조회 2,592
11-09-28 조회 2,410
11-09-24 조회 2,497
11-09-22 조회 2,393
11-09-05 조회 2,879
11-08-31 조회 2,257
11-08-31 조회 2,568
11-08-31 조회 2,421
11-08-29 조회 2,968
11-08-28 조회 2,466
11-08-25 조회 2,518
11-08-17 조회 2,233
11-08-16 조회 2,465
11-08-11 조회 2,923
11-08-07 조회 2,634
11-08-03 조회 2,348
11-07-22 조회 2,085
11-07-12 조회 3,308
11-06-27 조회 2,090
11-06-01 조회 1,755
11-05-17 조회 2,539
11-05-01 조회 2,612
11-04-28 조회 2,899
11-04-28 조회 2,951
11-04-13 조회 2,606
11-03-27 조회 2,730
11-03-27 조회 2,607
11-03-14 조회 2,021
11-03-02 조회 2,346
11-03-02 조회 2,577
11-02-27 조회 3,002
11-02-23 조회 2,386
11-02-19 조회 2,525
11-02-14 조회 4,136
11-02-03 조회 2,930
11-01-24 조회 3,879
11-01-04 조회 2,406
10-12-08 조회 5,419
10-11-15 조회 2,425
10-11-14 조회 2,607
10-11-14 조회 3,622
10-10-29 조회 3,693
10-10-19 조회 2,705
10-10-07 조회 2,531
10-10-05 조회 4,448
10-09-18 조회 2,747
10-09-18 조회 2,487
10-09-17 조회 4,893
10-09-15 조회 2,832
10-09-15 조회 2,361
10-09-15 조회 2,849
10-09-15 조회 2,679
10-09-11 조회 4,006
10-09-11 조회 2,512
10-09-11 조회 2,548
10-09-07 조회 3,825
10-09-07 조회 3,363
10-08-29 조회 2,822
10-07-01 조회 3,070
10-06-30 조회 2,477
10-06-30 조회 2,655
10-06-30 조회 3,010
10-06-13 조회 2,044
10-04-15 조회 3,215
10-04-04 조회 3,447
10-02-23 조회 3,551
10-02-09 조회 3,150
10-01-25 조회 2,656
10-01-25 조회 2,756
09-12-27 조회 4,402
09-11-23 조회 3,626
09-11-20 조회 4,860
09-08-30 조회 3,057
09-08-30 조회 3,050
09-08-12 조회 3,021
09-07-22 조회 4,080
09-07-22 조회 4,727
09-07-15 조회 5,895
09-07-11 조회 2,972
09-06-17 조회 2,715
09-06-15 조회 3,004
09-05-29 조회 3,281
09-05-11 조회 5,915
09-05-08 조회 2,671
09-04-30 조회 3,790
09-04-17 조회 3,110
09-04-04 조회 3,291
09-03-05 조회 3,674
09-02-09 조회 3,642
09-02-03 조회 6,147
08-12-27 조회 3,213
08-12-20 조회 4,300
08-11-21 조회 5,261
08-11-14 조회 2,831
08-11-03 조회 3,295