>백엔드 개발 >PHP 튜토리얼 >PHP_php 팁에서 mb_Detect_encoding 함수를 사용하는 방법에 대한 자세한 설명

PHP_php 팁에서 mb_Detect_encoding 함수를 사용하는 방법에 대한 자세한 설명

WBOY
WBOY원래의
2016-05-16 20:08:191171검색

PHP의 mb_Detect_encoding() 함수를 사용하여 문자열 인코딩을 결정할 수 있습니다.

인코딩 식별을 위해 PHP에서 mb_Detect_encoding 함수를 사용할 때 많은 사람들이 GB2312 및 UTF-8 또는 UTF-8 및 GBK(여기서는 주로 cp936 판단의 경우)와 같은 잘못된 인코딩 문제에 직면했습니다. mb_Detect_encoding이 짧은 문자로 인해 잘못 판단하게 되는 인터넷입니다.

코드는 다음과 같습니다.

$encode = mb_detect_encoding($keytitle, array("ASCII","UTF-8","GB2312","GBK","BIG5"));
if($encode == "UTF-8"){
  $keytitle = iconv("UTF-8","GBK",$keytitle);
}

이 코드의 목적은 문자열의 인코딩이 UTF-8인지 감지하고, 그렇다면 GBK로 변환하는 것입니다.
그러나 $keytitle = “о̬”;인 경우. 탐지 결과는 UTF-8입니다. 이 버그는 실제로 버그가 아니며, 프로그램 작성 시 mb_Detect_encoding에 너무 의존해서는 안 됩니다. 문자열이 짧을 경우 탐지 결과가 편향될 가능성이 높습니다.
해결방법 코드는 다음과 같습니다.

$encode = mb_detect_encoding($keytitle, array("ASCII","GB2312","GBK","UTF-8");

세 가지 매개변수는 감지할 입력 변수, 인코딩 방법의 감지 순서(일단 true이면 나중에 자동으로 무시됨), 엄격 모드는 인코딩 감지 순서를 조정하여 가장 큰 값을 지정합니다. 가능성을 먼저 고려하여 잘못 변환될 가능성을 줄입니다.
일반적으로 GBK와 UTF-8이 있는 경우에는 gb2312를 먼저 정렬해야 합니다.

PHP 문자열 인코딩 변환 및 판단


GBK와 UTF-8 인코딩 간의 변환은 매우 역겨운 일입니다. 예를 들어 PHP 자체의 json_encode는 GBK 인코딩을 전혀 지원하지 않습니다. 인코딩 변환을 지원할 수 있는 라이브러리 함수는 두 가지가 있습니다. 일반적으로 떠오르는 함수는 사용하기에도 매우 재미있는 iconv 함수입니다.

iconv('GBK', 'UTF-8//IGNORE', 'Test string'); // 문자열을 GBK 인코딩에서 UTF-8 인코딩으로 변환

그러나 iconv는 인코딩이 미리 알려진 상황만 해결할 수 있습니다. 문자열 인코딩을 알 수 없는 경우 먼저 해당 인코딩을 감지해야 합니다. 이 경우 mb_string 확장 라이브러리를 사용할 수 있습니다.

mb_Detect_encoding('테스트 문자열');

그러나 mb_Detect_encoding에는 결함이 있어 부정확한 판단이 자주 발생합니다. 어쩌면 이 문제가 해결될 수도 있습니다:


// 使用 iconv 转换并判断是否等值,效率不高
function is_utf8 ($str) {
  if ($str === iconv('UTF-8', 'UTF-8//IGNORE', $str)) {
    return 'UTF-8';
  }
}
// 多种编码的情况
function detect_encoding ($str) {
  foreach (array('GBK', 'UTF-8') as $v) {
    if ($str === iconv($v, $v . '//IGNORE', $str)) {
      return $v;
    }
  }
}

위의 방법을 통해 문자열 인코딩 정보를 얻은 후 iconv 또는 mb_convert_encoding을 사용하여 인코딩을 변환할 수 있습니다.

정의되지 않은 함수 mb_Detect_encoding() 호출 오류 해결


Windows 시스템에서:
1. 치명적인 오류: 정의되지 않은 함수 호출: 82행의 C:Program FilesAppServwww...xxx.php에서 iconv()
PHP에는 문자 인코딩 변환을 위한 iconv() 함수가 있습니다
Extension=php_iconv.dll
은 php.ini 파일에도 존재합니다. 이러한 진술은 이 기능의 정상적인 사용을 보장할 수 있습니다
php.ini 파일에서 Extension=php_iconv.dll 앞에 세미콜론
이 있는 경우 세미콜론이 있으면 제거하고 서버를 다시 시작하세요
문제를 해결하려면 프로그램을 다시 실행하세요

2. 치명적인 오류: 정의되지 않은 함수 호출: 1355행의 C:Program FilesAppServwww...xxx.php에서 mb_Detect_encoding()
1. PHP 확장 디렉터리를 찾습니다(내 PHP 확장 디렉터리 경로는 C:Program FilesAppServphpextensions입니다)
확장 디렉토리
에서 php_mbstring.dll 파일을 찾으세요. 2. php_mbstring.dll 파일을 php.ini 파일이 있는 디렉터리(내 php.ini 파일이 있는 디렉터리: C:WINDOWS)에 복사하세요.
3. 메모장으로 php.ini 파일을 열고 단축키 Ctrl F를 사용하여 Extension=php_mbstring.dll
을 찾으세요. 4. php.ini 파일에 Extension=php_mbstring.dll이 있는 경우
이 줄에서 확장자 앞에 있는 세미콜론을 제거합니다. 존재하지 않는 경우 다른 확장명=...,
의 다음 줄에 확장명=php_mbstring.dll을 추가합니다. ​ ​마지막으로 php.ini 파일을 저장하는 것을 잊지 마세요
5. Apache 서버를 다시 시작하세요

php_mbstring.dll 파일을 php.ini가 있는 디렉토리에 복사하지 않으면 작동하지 않는다는 것을 방금 발견했습니다

Linux 시스템:

다음과 같은 문제가 발생한 경우:

PHP 1. {main}() /home/xu/web/whois/ab.cn.php:0
PHP 2. base_func->is_exist() /home/xu/web/whois/ab.cn.php:21
PHP 3. strftime() /home/xu/web/whois/whois.mysql.php:46
ab.cnis 존재df250b2156c434f3390392d09b1c9563PHP 치명적인 오류: 98행의 /home/xu/web/whois/whois.main.php에서 정의되지 않은 함수 mb_Detect_encoding() 호출
인터넷에서 다양한 정보를 검색한 결과, php 플러그인인 php-mbstring이 설치되어 있지 않다는 것을 알게 되었습니다(일부 학생들은 php.ini에서 이 플러그인을 활성화하지 않았을 수도 있습니다). 참고용으로 이 파일을 작성했습니다.

먼저 yum 또는 apt를 사용하여 mbstring.so를 설치하고 다음 명령을 사용하십시오: yum install php-mbstring 또는 apt-get install php-mbstring(우분투 사용자는 설치하기 전에 apt-cache 검색 mbstring을 사용하여 소프트웨어를 검색하는 것이 가장 좋습니다. 이름이 틀릴 수도 있습니다)

그런 다음 php.ini를 수정합니다. vim /etc/php.ini를 실행하고 Extension="/usr/lib/php/modules/mbstring.so" 콘텐츠를 추가합니다. 다음 경로는 mbstring에 따라 저장될 수 있습니다. .so 디렉토리에 해당 변경사항을 적용하면 됩니다. 일반적으로 변경할 필요가 없습니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.