개발 꿀팁/PHP

php 페이지 인코딩 및 문자 작업

Jammie 2022. 9. 28. 11:41
반응형

우리는 header를 사용하여 php 페이지를 utf 인코딩 또는 GBK 인코딩으로 정의할 수도 있고, HTML에서 메타데이터 태그를 사용하여 인코딩을 지정할 수도 있습니다.
예: php 페이지는 utf 인코딩 헤더("Content-type: text/html; chars")et=utf-8"),
우리는 보통 header나 meta를 사용하는데, 다음은 둘의 차이점을 말하겠습니다

1.메타페이지코드사용
메타데이터로 페이지 편집 설정야드

1 < meta http-equiv="content-type" content="text/html; charset=코딩 유형">

클라이언트의 브라우저가 어떤 문자 집합으로 이 페이지를 표시할 것인지 선언하여 브라우저에게 알려주는 역할을 합니다.문자 인코딩과 브라우저 인코딩이 같을 때만 오류를 일으키지 않고 깨집니다.

2. header() 페이지 인코딩 사용
헤더( )로 페이지 인코딩 설정

1 header("content-type:text/html; charset= 인코딩 형식")

헤더(header)는 원래 HTTP 헤더로 괄호 안의 정보를 HTTP 헤더로 보내는 역할을 하며 브라우저는 헤더()에 설정된 인코딩을 사용합니다.

3. AddDefaultCharset 방식 설정 인코딩
참고: 이전 버전의 Apache 구성 시 AddDefaultCharset 이 옵션을 수정하려면 gb2312 또는 utf-로 변경하십시오.8. 그렇지 않으면 한자가 깨질 수 있지만 Apache 2.0.53에서 시작, AddDefaultCharset을 없애고, 현재의 새로운 버전은 브라우저에 적응할 것입니다.그래서 apache 2.4에서는 AddDefaultCharset을 찾을 수 없습니다.
문서 중:

Apache의 낮은 버전의 .conf 파일에 AddDefaultCharset이 있습니다.defaultcharset 문자 인코딩(앞의 # 삭제)을 설정할 수 있습니다.설정이 완료되면 각 파일에 header("content-type:text/html; charset=문자 인코딩")를 추가하는 것과 같습니다.

그래도 header()와는 차이가 있어 (우선도가 달라)
1: 페이지에 인코딩이 지정되지 않은 경우 Apache는 defaultcharset gbk를 구성하며 페이지 파일 인코딩은 utf-8입니다.

페이지에 깨진 코드라고 뜨네요.페이지에 charset을 지정하는 meta가 없습니다. defaultcharset gbk를 설정합니다. 이때 서버의 설정이 유효하며 코드가 일치하지 않아 깨집니다.

2: 페이지가 utf-8로 지정되면 Apache 구성 defaultcharset gbk. 페이지 파일 인코딩은 utf-8입니다.

페이지에 깨진 코드가 뜨다.defaultcharset gbk를 설정하면, 페이지 레벨(meta) 인코딩 설정을 덮어씁니다.

3: 페이지 header는 charset이 utf8이고 Apache가 defaultcharst gbk를 배치하면 페이지 파일 코드는 utf8이다.

페이지가 정상으로 나옵니다.이것은 header가 서버와 브라우저의 설정보다 우선 순위를 높입니다.

4: Apache가 DefaultCharset을 닫으면.

페이지가 정상으로 나옵니다.

결론:
header( ) > AddDefaultCharset >> meta
그래서 header()를 추가하는 게 좋은 방법인 것 같아요.

넷째, 부호화 변환

1: mb_detect_encoding 인코딩 확인

1 $string = "자오야페이";
2 $encode = mb_detect_encoding($string, array("ASCII","UTF-8","GB2312","GBK","BIG5"));
3 header("content-Type: text/html; charset=".$encode);
4 echo $string;

때때로 GB2312 및 UTF-8과 같은 검사 오류(해결 방법)가 발생하거나 UTF-8 및 GBK 온라인에서는 문자가 짧기 때문에 mb_detect_encoding이 오판될 수 있습니다. bug가 아니라 프로그램을 작성할 때 mb_detect_encoding에 너무 의존해서는 안 되며, 문자열이 짧을 때 검출 결과에 편차가 발생할 가능성이 높습니다.

encode=mbdetectencoding(keytitle, array)('ASCII', 'GB2312', 'GBK', 'UTF-8').
세 가지 파라미터는 검출된 입력 변수, 부호화 방식의 검출 순서(참일 경우 뒤에 자동으로 무시), strict 모드이다.
코딩 검출의 순서를 조정하여 최대 가능성을 앞세워 잘못 변환될 가능성을 줄입니다. 일반적으로 gb2312를 먼저 배열해야 하며 GBK와 UTF-8이 있는 경우 일반적으로 사용되는 것을 앞에 배열해야 합니다.

2:mb_convert_encoding 변환 인코딩
함수 원형: string mb_convert_encoding (string str, string to_encoding [, mixed from_encoding])
예:

1: 원하는 종류로( 'ASCII,GB2312,GBK,UTF-8')문자열 $html_str을 'UTF-8' 인코딩으로 변환
     $html_str = mb_convert_encoding($html_str, 'UTF-8', 'ASCII,GB2312,GBK,UTF-8');
2:gbk To utf-8
 < ?php
    header("content-Type: text/html; charset=Utf-8");
    echo mb_convert_encoding("자오야페이", "UTF-8", "GBK");
 ?>

참고: 위의 함수를 사용하려면 설치가 필요하지만 먼저 enable mbstring 확장 라이브러리가 필요합니다. php.ini에서; extension=php_mbstring.dll 앞에 있는; 제거

mb_convert_encoding은 다양한 입력 코딩을 지정할 수 있으며, 이는 내용에 따라 자동으로 인식되며, 실행 효율은 iconv에 비해 매우 떨어집니다.

3: iconv 변환 인코딩
iconv 함수 라이브러리는 다양한 문자 집합 간의 변환을 완료할 수 있으며 php 프로그래밍에서 없어서는 안될 기본 함수 라이브러리입니다.
주의가 필요합니다.
iconv는 문자 변환 중에 오류가 발생할 수 있습니다. (utf-8을 gb2312로 변환하면 문자열이 잘리는 경우가 있습니다.)
해결 방법: 변환이 필요한 코딩 후에 '//IGNORE'를 추가하는 것은 iconv 함수의 두 번째 매개변수입니다.
다음과 같습니다

1  iconv("UTF-8","GB2312//IGNORE",$data)

이그노어는 변환 시 오류를 무시한다는 의미이며, 이그노어 매개 변수가 없으면 이 문자열 뒤에 있는 모든 문자열을 저장할 수 없습니다(아래로 변환하지 않음).
iconv는 php의 기본 함수도 아니고 기본적으로 설치된 모듈도 아닙니다.설치하셔야 사용할 수 있습니다.
여기 코딩 유형을 자동으로 판단하고 변환하는 기능이 있습니다

function check_encod($encod,$string){
         //판단 문자 인코딩
        $encode = mb_detect_encoding($string, array("ASCII","UTF-8","GB2312","GBK","BIG5"));
        var_dump($encode);
        if($encode != $encod){
             $string = iconv($encode, $encod, $string);
         }
         return $string;
 }
$path = "자오야페이。.jpg";
$path = check_encod("GB2312",$path);

5: 문자열 잘라내기
1:mb_substr()
PHP substr() 함수 가분문자를 분할하지만 분할된 문자가 중국어 문자를 포함하면 종종 문제가 발생하는데 이때 mb_substr()라는 함수를 사용할 수 있으며 사용 방법은 substr()와 유사하지만 mb_substr()의 마지막에 하나 이상의 매개변수를 추가하여 문자열 인코딩을 설정하려면 php_mbstring.dll을 켜야 하며 php.ini에서 php_mbstring.dll을 켜야 합니다.예:

1  echo mb_substr('조아비 조아비er',0,9);         //수출하다:조아비 
2  echo mb_substr('조아비 조아비er',0,9,'utf-8'); //수출하다:조아비 조아비er

첫 번째는 3바이트를 하나의 중국어로 사용하는 것인데, 이것이 바로 utf-8 코딩의 특징이며, 아래에 utf-8 문자 집합의 설명을 덧붙여서 한 글자 단위로 절취한 것이다.

2:iconv_substr()
Substr은 문자를 절취하는 함수이지만, 중국어 절취는 추가 처리가 필요한 경우가 많은데, 그 이유는 중국어가 UTF-8에서 세 글자를 차지하기 때문이다.절, GB2312에서 2바이트를 차지하며, 차단합니다.취중에 수시로 잘라낸 문자열의 길이와 구성을 알 수 없어 많은 사람들이 불편을 겪었다.PHP5 시작, iconv_substr 함수 출현

1 <?php
2       $str='赵z亚y飞f/include';  
3       echo substr($str,1,5);
4       echo "<br>";
5       echo iconv_substr($str,1,5,"UTF-8");  
6 ?>

이것은 웹페이지에서 UTF-8로 인코딩된 PHP 코드에 사용되는 캡처 인코딩입니다.UTF-8 웹 페이지에서 GB2312 또는 GBK 인코딩을 사용하여 캡처하면 오류가 발생하여 바이트를 다르게 차지하지만 반대로 GB2312 또는 GBK 웹 페이지에서는 UTF-8을 사용하여 캡처할 수 없습니다.iconv_substr은 바이트가 아닌 문자를 기준으로 계산되기 때문에 'a'와 '잎'은 모두 1비트로 계산됩니다.GB2312 또는 GBK에서는 점유 바이트가 동일하기 때문에 GB2312 또는 GBK 코드를 임의로 사용하여 캡처할 수 있으며 캡처 결과는 동일합니다.

3: 호환성이 좋은 잘라낸 문자열의 함수

/**
      * 잘라낸 문자열은 각종 코드와 호환된다
      *
      * @param string $str
      * @param int    $start    //캡처 시작 위치 기본값은 0입니다
      * @param int    $length   //절취 길이
      * @param string $charset  //문자 인코딩
      * @param int    $is_addnode  //생략 부호 추가 여부
      * @return string
      **/
    public static function cut_string($str, $start=0, $length, $charset="", $is_addnode=true){
        if(empty($str) || $str == ''){
            return $str;
        }
        $real_set = mb_detect_encoding($str, array("UTF-8", "ASCII", "GB2312", "GBK", "BIG5"));
        if(empty($charset)){
            //인코딩을 전송하지 않고 그대로 인코딩합니다;
            $charset = $real_set;
            if(empty($charset)){
                $charset = 'utf-8';
            }
        }else{
            if($real_set != $charset){
                //인코딩이 일치하지 않으면 들어오는 인코딩으로 설정하여, 스크램블을 방지
                $str = iconv($real_set, $charset, $str);
            }
        }

        //확장 기능이 설치되어 있지 않은 경우 호환 가능
        if(function_exists("mb_substr")){
            $cut_str = mb_substr($str, $start, $length, $charset);
        }elseif(function_exists('iconv_substr')) {
            $cut_str = iconv_substr($str, $start, $length, $charset);
        }
        if($is_addnode){
            if($str == $cut_str){
                return $cut_str;
            }else{
                return $cut_str . "......";
            }
        }else{
            return $cut_str;
        }
        //호환 정규 절취
        $preg['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
        $preg['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
        $preg['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
        $preg['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
        preg_match_all($preg[$charset], $str, $match);
        $string = join("",array_slice($match[0], $start, $length));
        if($is_addnode){
            return $string . "......";
        }
        return $string;
    }

 

반응형