KSC5601
[ class tree: KSC5601 ] [ index: KSC5601 ] [ all elements ]

Source for file KSC5601.php

Documentation is available at KSC5601.php

  1. <?php
  2. /**
  3.  * Project: KSC5601 :: convert character set between KSC5601 and UTF8<br>
  4.  * File:    KSC5601.php
  5.  *
  6.  * KSC5601 pear 패키지는 한글과 관련된 변환 및 체크에 대한 method를 제공한다.
  7.  *
  8.  * UHC와 UTF8 또는 UHC와 UCS2, UHC(또는 CP949)와 NCR (Numeric character reference)
  9.  * 코드간의 변환을 제공하며, 또한 UHC와 NCR간의 변환은 KSX1001 범위 밖의 인식되지
  10.  * 못하는 문자를 출력 가능하게 한다.
  11.  *
  12.  * 그 외에 utf-8 여부 체크와 ksc5601 여부 체크가 가능하며, 다국어 처리를 위한
  13.  * substr을 제공한다.
  14.  *
  15.  * @category   Charset
  16.  * @package    KSC5601
  17.  * @author     JoungKyun.Kim <http://oops.org>
  18.  * @copyright  (c) 2015, JoungKyun.Kim
  19.  * @license    BSD License
  20.  * @version    $Id$
  21.  * @link       http://pear.oops.org/package/KSC5601
  22.  * @since      File available since Release 0.1
  23.  * @filesource
  24.  * @example    KSC5601/test/test.php Sample codes of KSC5601 class
  25.  */
  26.  
  27. /**
  28.  * import KSC5601_Common class that checked support or unsupport PHP iconv or
  29.  * mbstring extensions.
  30.  */
  31. require_once 'KSC5601/Common.php';
  32.  
  33. // {{{ constant
  34. /**#@+
  35.  * @access public
  36.  */
  37. /**
  38.  * Local charset string
  39.  * @name LOC
  40.  */
  41. define ('LOC',    'loc');
  42. /**
  43.  * UTF8 charset string
  44.  * @name UTF8
  45.  */
  46. define ('UTF8',   'utf8');
  47. /**
  48.  * EUC-KR charset string
  49.  * @name EUC-KR
  50.  */
  51. define ('EUCKR''euc-kr');
  52. /**
  53.  * CP949 Alias
  54.  * @name UHC
  55.  */
  56. define ('UHC',    'cp949');
  57. /**
  58.  * CP949 charset string
  59.  * @name CP949
  60.  */
  61. define ('CP949',  'cp949');
  62. /**
  63.  * UCS2 big endian charset string
  64.  * @name UCS2
  65.  */
  66. define ('UCS2',   'ucs-2be');
  67. /**
  68.  * Numeric Code Reference string
  69.  * @name NCR
  70.  */
  71. define ('NCR',    'ncr');
  72. /**#@-*/
  73. //}}}
  74.  
  75. /**
  76.  * KSC5601 pear 패키지는 한글과 관련된 변환 및 체크에 대한 method를
  77.  * 제공한다.
  78.  *
  79.  * UHC와 UTF8 또는 UHC와 UCS2, UHC(또는 CP949)와 NCR (Numeric character
  80.  * reference) 코드간의 변환을 제공하며, 또한 UHC와 NCR간의 변환은 KSX1001
  81.  * 범위 밖의 인식되지 못하는 문자를 출력 가능하게 한다.
  82.  *
  83.  * 그 외에 utf-8 여부 체크와 ksc5601 여부 체크가 가능하며, 다국어 처리를
  84.  * 위한 substr을 제공한다.
  85.  *
  86.  * @package KSC5601
  87.  */
  88. Class KSC5601
  89. {
  90.     // {{{ properties
  91.     /**#@+
  92.      * @access private
  93.      */
  94.     /**
  95.      * KSC5601_common object
  96.      * @var KSC5601_Common 
  97.      */
  98.     private $chk;
  99.     /*
  100.      * internal KSC5601 API object
  101.      * @var KSC5601_pure|KSC5601_ext
  102.      */
  103.     private $obj;
  104.     /**#@-*/
  105.     // }}}
  106.  
  107.     // {{{ constructor
  108.     /**
  109.      * iconv 또는 mbstring 확장이 지원되면, 내부적으로 KSC5601_ext class
  110.      * 사용하며, 지원되지 않으면, KSC5601_pure class를 사용한다.
  111.      *
  112.      * 성능상으로는 iconv 또는 mbstring이 지원되는 것이 좋다.
  113.      *
  114.      * @access public
  115.      * @return void 
  116.      */
  117.     function __construct ({
  118.         $this->chk new KSC5601_Common;
  119.  
  120.         if $this->chk->is_extfunc (=== true {
  121.             /**
  122.              * KSC5601_ext class method use iconv or mbstring extension
  123.              */
  124.             require_once 'KSC5601/KSC5601_ext.php';
  125.             $this->obj new KSC5601_ext ($this->chk);
  126.         else {
  127.             /**
  128.              * KSC5601_pure class method don't use iconv and mbstring extensions.
  129.              * This class is construct with pure php code and character set code
  130.              * tables.
  131.              */
  132.             require_once 'KSC5601/KSC5601_pure.php';
  133.             $this->obj new KSC5601_pure;
  134.         }
  135.     }
  136.     // }}}
  137.  
  138.     // {{{ (boolean) KSC5601:: out_of_ksx1001 ($flag = false)
  139.     /**
  140.      * KSX1001 범위 밖의 한글을 변환할 것인지 여부를 설정한다. 이 menotd는
  141.      * private $out_ksx1001 변수값을 변경한다.
  142.      *
  143.      * @access  public
  144.      * @return  boolean Return
  145.      * @param   boolean (optional) 기본값 false
  146.      *   <ol>
  147.      *       <li>true : UTF-8 디코드시, KSX1001 범위 밖의 한글 문자를 NCR로
  148.      *                  변환한다.
  149.      *       <li>true : UHC(CP949)에서 NCR로 변환시, KSX1001 범위 밖의 한글
  150.      *                  문자만 NCR로 변환한다.
  151.      *       <li>false : 아무 액션을 하지 않는다.</li>
  152.      *   </ol>
  153.      */
  154.     function out_of_ksx1001 ($flag false{
  155.         return $this->obj->out_of_ksx1001 ($flag);
  156.     }
  157.     // }}}
  158.  
  159.     // {{{ (boolean) KSC5601:: is_utf8 ($string, $ascii_only_check)
  160.     /**
  161.      * 주어진 문자열이 utf8인지 아닌지를 검사한다.
  162.      *
  163.      * @access  public
  164.      * @return  boolean utf-8 문자열 또는 ascii로만 구성이 된 문자열이이면
  165.      *                   true를 반환한다.
  166.      * @param   string  검사할 문자열
  167.      * @param   boolean true로 설정시, 문자열이 ascii로만 구성되어 있으면
  168.      *                   false를 반환한다.
  169.      */
  170.     function is_utf8 ($string$ascii_only_check false{
  171.         return $this->obj->is_utf8 ($string$ascii_only_check);
  172.     }
  173.     // }}}
  174.  
  175.     // {{{ +-- public (boolean) is_hangul ($s)
  176.     /**
  177.      * 주어진 문장에 한글(UTF-8/EUC-KR)이 포함되어 있는지를 검사
  178.      *
  179.      * 이 method의 경우에는 한글이 아닌 다른 multibyte 문자의 마지막 바이트와
  180.      * 첫번째 바이트에 의한 오차가 발생할 수 있으므로 정확도가 필요할 경우에는
  181.      * is_ksc5601 method를 이용해야 한다.
  182.      *
  183.      * @access public
  184.      * @return boolean 
  185.      * @param string 
  186.      * @since 2.0.3
  187.      */
  188.     function is_hangul ($s{
  189.         // UTF-8 case
  190.         if preg_match ('/[\x{1100}-\x{11FF}\x{3130}-\x{318F}\x{AC00}-\x{D7AF}]/'$s) )
  191.             return true;
  192.  
  193.         // EUC-KR case
  194.         if preg_match ('/[\xA1-\xFE]/'$s) )
  195.             return true;
  196.  
  197.         return false;
  198.     }
  199.     // }}}
  200.  
  201.     // {{{ (boolean) KSC5601:: is_ksc5601 ($string)
  202.     /**
  203.      * 주어진 2byte 문자가 ksc5601의 범위에 있는지 확인한다.
  204.      *
  205.      * 주의할 것은 문자열을 지정했을 경우 처음 2byte만 체크한다.
  206.      *
  207.      * @access  public
  208.      * @return  boolean ksc5601의 범위 안에 있을 경우 true 반환
  209.      * @param   string  2byte 문자
  210.      * @param   boolean 사용하지 않음. 기본값 false
  211.      * @since   version 2.0.1
  212.      */
  213.     function is_ksc5601 ($string$ksx1001 false{
  214.         if strlen ($string!= )
  215.             return false;
  216.  
  217.         $c1 ord ($string[0]);
  218.         $c2 ord ($string[1]);
  219.  
  220.         if ($c1 0x80) )
  221.             return false;
  222.  
  223.         if $ksx1001 === true {
  224.             if ( ($c1 0x80 && $c1 0xa2 && $c2 0x40 && $c2 0xff||
  225.                  ($c1 0xa0 && $c1 0xc7 && $c2 0x40 && $c2 0xa1) ) {
  226.                 if $c2 0x41 || $c2 0x61 )
  227.                     return false;
  228.                 if $c2 0x5a && $c2 0x61 )
  229.                     return false;
  230.                 if $c2 0x7a && $c2 0x81 )
  231.                     return false;
  232.             else
  233.                 return false;
  234.         else {
  235.             if (($c1 0x80 && $c1 0xa2 && $c2 0x40 && $c2 0xff||
  236.                  ($c1 0xa0 && $c1 0xc7 && $c2 0x40 && $c2 0xa1)) )
  237.                 return false;
  238.         }
  239.  
  240.         return true;
  241.     }
  242.     // }}}
  243.  
  244.     // {{{ (boolaen) KSC5601:: is_ksx1001 ($string)
  245.     /**
  246.      * 주어진 2byte 문자가 ksx1001의 범위에 있는지 확인한다.
  247.      *
  248.      * 주의할 것은 문자열을 지정했을 경우 처음 2byte만 체크한다.
  249.      *
  250.      * @access  public
  251.      * @return  boolean ksx1001의 범위 안에 있을 경우 true 반환
  252.      * @param   string  2byte 문자
  253.      * @since   version 2.0.1
  254.      */
  255.     function is_ksx1001 ($string{
  256.         return self::is_ksc5601 ($stringtrue);
  257.     }
  258.     // }}}
  259.  
  260.     // {{{ (string|false) KSC5601:: substr ($str, $start, $len)
  261.     /**
  262.      * 지정된 시작지점에서 지정될 길이만큼의 문자열을 반환한다.
  263.      *
  264.      * EUC-KR과 UTF-8을 모두 지원하며, UTF-8 CJK 문자열의 경우 3byte 문자는
  265.      * 길이를 2byte로 계산하여 반환한다. (2byte utf-8은 지원하지 않는다.)
  266.      *
  267.      * UTF-8 문자열 처리의 경우, CJK(Chinese, Japanese, Korean) 모두 처리
  268.      * 가능 하며 non UTF-8의 경우 EUC-KR과 EUC-JP에 사용 가능하다.
  269.      *
  270.      * 이 외의 동작은 PHP core의 {@link http://php.net/manual/en/function.substr.php substr()}
  271.      * 함수와 동일하게 동작한다.
  272.      *
  273.      * @access public
  274.      * @since  버전 2.0.2
  275.      * @return string|false
  276.      * @param  string  원본 문자열
  277.      * @param  integer 시작 지점. 0부터 시작한다.
  278.      * @param  integer 반환할 문자열 길이
  279.      */
  280.     function substr ($str$start$len{
  281.         if $len === return false;
  282.  
  283.         if self::is_utf8 ($str) ) {
  284.             $slen strlen ($str);
  285.             if $start )
  286.                 if ( ($start $slen $start)
  287.                     return false;
  288.  
  289.             if $start {
  290.                 if ord ($str[$start]128 )
  291.                     if self::is_ksc5601 (substr ($str$start2)) )
  292.                         $start--;
  293.             }
  294.  
  295.             if ( ($str substr ($str$start$len)) === false )
  296.                 return false;
  297.  
  298.  
  299.             return preg_replace ('/(([\x80-\xFE].)*)[\x80-\xFE]?$/''\\1'$str);
  300.         }
  301.  
  302.         //
  303.         // Hangul Jamo                           0x1100 - 0x11ff
  304.         // Hangul Compatibility Jamo             0x3130 - 0x318f
  305.         // Hangul Syllables (한글)               0xac00 - 0xd7af
  306.         //
  307.         // Hiragana                              0x30a0 - 0x30ff
  308.         // Katakana                              0x3100 - 0x312f
  309.         // Katakana Phonetic Extensions          0x31f0 - 0x31ff
  310.         // 
  311.         // CJK Radicals Supplement               0x2e80 - 0x2eff
  312.         // CJK Symbols and Punctuation           0x3000 - 0x303f
  313.         // * Enclosed CJK Letters and Months     0x3200 - 0x32ff
  314.         // * CJK Compatibility                   0x3300 - 0x33ff
  315.         // CJK Unified Ideographs Extension A    0x3400 - 0x4dbf
  316.         // * CJK Unified Ideographs (한자)       0x4e00 - 0x9fff
  317.         // CJK Compatibility Ideographs          0xf900 - 0xfaff
  318.         // CJK Compatibility Forms               0xfe30 - 0xfe4f
  319.         // CJK Unified Ideographs Extension B    0x20000 - 0x2a6df
  320.         //
  321.         $pattern  '\x{1100}-\x{11ff}\x{3130}-\x{318f}\x{ac00}-\x{d7af}'// Hnagul
  322.         $pattern .= '\x{30a0}-\x{30f0}\x{3100}-\x{312f}\x{31f0}-\x{31ff}'// Japanese
  323.         $pattern .= '\x{3200}-\x{32ff}\x{3300}-\x{33ff}\x{3400}-\x{4dbf}'// Hanja
  324.         $pattern .= '\x{4e00}-\x{9fff}\x{f900}-\x{faff}\x{20000}-\x{2a6df}'// Hanja
  325.         preg_match_all ("/[{$pattern}]|./u"$str$matches_all);
  326.         $matches $matches_all[0];
  327.  
  328.         // 3byte 문자를 2byte로 계산해서 문자열 길이를 구함
  329.         $slen 0;
  330.         for $i=0$i<count ($matches)$i++ )
  331.             $slen += (strlen ($matches[$i]11;
  332.  
  333.         // $start가 음수일 경우 양수로 변환
  334.         if $start )
  335.             if ( ($start $slen $start)
  336.                 return false;
  337.  
  338.         if $start >= $slen )
  339.             return false;
  340.  
  341.         // 반환할 길이가 문자열 길이보다 길면 문자열 길이로 조정
  342.         if $len $slen )
  343.             $len $slen;
  344.  
  345.         // len이 음수일 경우 양수로 변환
  346.         if $len )
  347.             if ( ($len $slen $len)
  348.                 return false;
  349.         
  350.         $count 0;
  351.         if $start {
  352.             if $start $len $slen )
  353.                 $len $slen $start;
  354.  
  355.             $no count ($matches);
  356.             for $i=0$i<$no$i++ {
  357.                 $buf array_shift ($matches);
  358.                 $blen strlen ($buf);
  359.                 $count += ($blen 11;
  360.                 if $count $start {
  361.                     array_unshift ($matches$buf);
  362.                     break;
  363.                 }
  364.                 $slen -= ($blen 11;
  365.             }
  366.         else {
  367.             for $i=0$i<count ($matches)$i++ )
  368.                 $slen += (strlen ($matches[$i]11;
  369.                 
  370.             if $slen <= $len )
  371.                 return $str;
  372.         }
  373.  
  374.         $r null;
  375.         foreach $matches as $v {
  376.             $count += (strlen ($v21;
  377.             if $count $len )
  378.                 break;
  379.             $r .= $v;
  380.         }
  381.  
  382.         return $r;
  383.     }
  384.     // }}}
  385.  
  386.     // {{{ (string) KSC5601:: utf8 ($string, $to = UTF8)
  387.     /**
  388.      * Convert between UHC and UTF-8
  389.      * UHC(CP949)와 UTF-8 간의 변환을 제공한다.
  390.      *
  391.      * @access  public
  392.      * @return  string 
  393.      * @param   string  변환할 원본 문자열
  394.      * @param   string  (optional) 기본값 UTF8. 사용할 수 있는 값으로 UTF8 또는
  395.      *                   UHC 상수를 사용할 수 있다.
  396.      *
  397.      *                   이 인자를 설정하지 않거나 또는 UTF8 상수로 설정을 하면,
  398.      *                   원본 문자열을 UTF-8로 변환한다.
  399.      *
  400.      *                   UHC 상수로 설정하면, UTF-8에서 UHC로 변환한다. 내부적으로
  401.      *                   KSC5601::out_of_ksx1001 (true) 코드에 의하여 private
  402.      *                   $out_ksx1001 변수가 true로 설정이 되면, KSX1001 범위
  403.      *                   밖의 문자에 대해서는 NCR로 변환을 한다.
  404.      * @see KSC5601::out_of_ksx1001()
  405.      * @since version 2.0.2, 이전 버전에서는 KSC5601::out_of_ksc1001()
  406.      */
  407.     function utf8 ($string$to UTF8{
  408.         return $this->obj->utf8 ($string$to);
  409.     }
  410.     // }}}
  411.  
  412.     // {{{ (string) ucs2 ($string, $to = UCS2, $asc = false)
  413.     /**
  414.      * UHC와 UCS2간의 변환을 제공한다.
  415.      *
  416.      * @access  public
  417.      * @return  string 
  418.      * @param   string  원본 문자열
  419.      * @param   string  (optional) 기본값 UCS2. 사용할 수 있는 값으로 UCS2 또는
  420.      *                   UHC 상수를 사용할 수 있따.
  421.      *
  422.      *                   UCS2 상수로 설정을 하면, UHC를 UCS2 16진수(예를 들면
  423.      *                   U+B620)로 변환을 한다.
  424.      *
  425.      *                   UHC로 설정을 하면, UC2 16진수 문자를 UHC로 변환한다.
  426.      * @param   boolean (optional) 기본값 false. 이 파라미터는 오직 두번째
  427.      *                   파라미터가 UCS2일 경우에만 작동한다.
  428.      *
  429.      *                   false로 설정이 되면, KSX1001 범위 밖의 한글만 UCS2
  430.      *                   16진수 값으로 변환한다.
  431.      */
  432.     function ucs2 ($string$to UCS2$asc false{
  433.         return $this->obj->ucs2 ($string$to$asc);
  434.     }
  435.     // }}}
  436.  
  437.     // {{{ (string) ncr ($string, $to = NCR, $enc = false)
  438.     /**
  439.      * UHC와 NCR(Numeric Code Reference)간의 변환을 제공한다.
  440.      *
  441.      * @access  public
  442.      * @return  string 
  443.      * @param   string  원본 문자열
  444.      * @param   string  (optional) 기본값 NCR. 사용할 수 있는 값으로 NCR 또는
  445.      *                   UHC 상수를 사용할 수 있다.
  446.      *
  447.      *                   NCR 상수로 설정이 되면, UHC(CP949)를 NCR 코드로
  448.      *                   변환한다.
  449.      *
  450.      *                   UHC 상수로 설정이 되면, NCR 코드를 UHC(CP949)로
  451.      *                   변환한다.
  452.      * @param   boolean (optional) 기본값 false. 이 파라미터는 두번째 파라미터가
  453.      *                   NCR일 경우에만 작동한다.
  454.      *
  455.      *                   false로 설정되면, KSC5601::out_of_ksx1001(true)가 호출이
  456.      *                   되어 내부적으로 private $out_ksx1001 변수의 값이 true로
  457.      *                   설정이 되었을 경우, KX1001 범위 밖의 한글만 NCR로
  458.      *                   변환한다.
  459.      *
  460.      *                   true로 설정이 되면 모든 문자를 NCR 코드로 변환한다.
  461.      */
  462.     function ncr ($string$to NCR$enc false{
  463.         return $this->obj->ncr ($string$to$enc);
  464.     }
  465.     // }}}
  466.  
  467.     // {{{ function make_reverse_table ()
  468.     /**
  469.      * KSC5601의 역변환 테이블을 PHP code로 출력한다.
  470.      * 이 method는 KSC5601 pure code 개발을 위해서만 필요하다.
  471.      *
  472.      * @access public
  473.      * @return void 
  474.      * @param  void 
  475.      */
  476.     function make_reverse_table ({
  477.         if $this->chk->is_extfunc (=== false {
  478.             $this->obj->make_reverse_table ();
  479.         }
  480.     }
  481.     // }}}
  482. }
  483.  
  484. /*
  485.  * Local variables:
  486.  * tab-width: 4
  487.  * c-basic-offset: 4
  488.  * End:
  489.  * vim600: noet sw=4 ts=4 fdm=marker
  490.  * vim<600: noet sw=4 ts=4
  491.  */
  492. ?>

Documentation generated on Fri, 30 Aug 2024 06:10:34 +0900 by phpDocumentor 1.4.4