>  기사  >  백엔드 개발  >  PHP를 사용하여 유니코드를 UTF-8로 변환하는 구현 방법 공유

PHP를 사용하여 유니코드를 UTF-8로 변환하는 구현 방법 공유

PHPz
PHPz원래의
2017-03-05 14:30:171744검색

다음 편집기에서는 PHP를 사용하여 유니코드를 UTF-8로 변환(권장)하는 방법에 대한 기사를 제공합니다. 편집자님이 꽤 좋다고 생각하셔서 지금 공유하고 모두에게 참고용으로 드리고자 합니다. 편집자를 따라가서 살펴보겠습니다.

예제는 다음과 같습니다.

function unescape($str) {
  $str = rawurldecode($str);
  preg_match_all("/(?:%u.{4})|.{4};|\d+;|.+/U",$str,$r);
  $ar = $r[0];
  //print_r($ar);
  foreach($ar as $k=>$v) {
    if(substr($v,0,2) == "%u"){
      $ar[$k] = iconv("UCS-2BE","UTF-8",pack("H4",substr($v,-4)));
 }
    elseif(substr($v,0,3) == ""){
      $ar[$k] = iconv("UCS-2BE","UTF-8",pack("H4",substr($v,3,-1)));
 }
    elseif(substr($v,0,2) == "") {
       
      $ar[$k] = iconv("UCS-2BE","UTF-8",pack("n",substr($v,2,-1)));
    }
  }
  return join("",$ar);
}
echo unescape("紫星蓝");

오늘 양식 시스템 사용자가 제출한 중국 데이터가 왜곡된다는 사용자 보고가 있었습니다. 테스트 결과 문제는 iconv 변환에 있는 것으로 나타났습니다.
iconv('UCS-2',
'GBK',
'중국어')
Google

검색에서 그 이유는 UCS-2 인코딩 방식이 Linux 서버는 Winodws Incondependent의 서버와 다릅니다.

그래서

iconv('UCS-2BE',
'GBK',
'중국어')
로 바꿔봤습니다. 중국어는 정상입니다

다음은 두 플랫폼의 UCS-2 인코딩에 관한 무언의 규칙입니다

UCS-2 인코딩:

1. UCS-2는 UTF-16과 동일하지 않습니다. UTF-16은 ASCII 문자 범위를 사용하여 각 바이트를 인코딩하는 반면, UCS-2는 ASCII 문자 범위를 넘어서 각 바이트를 인코딩할 수 있습니다. UCS-2와 UTF-16은 문자당 최대 2바이트를 차지하지만 인코딩은 서로 다릅니다.

2. UCS-2의 경우 Windows의 기본값은 UCS-2LE입니다. MultibyteToWidechar(또는 A2W)를 사용하면 UCS-2LE 유니코드가 생성됩니다. Windows 메모장은 추가 변환 레이어와 동일한 UCS-2BE로 텍스트를 저장할 수 있습니다.

3. UCS-2의 경우 Linux의 기본값은 UCS-2BE입니다. UCS-2BE 유니코드를 변환하고 생성하려면 iconv(UCS-2 지정)를 사용하세요. Windows 플랫폼에서 UCS-2를 변환하는 경우 UCS-2LE를 지정해야 합니다.

4. Windows, Linux(UCS-2LE, UCS-2BE) 등 여러 플랫폼에서 UCS-2에 대한 이해가 서로 다르기 때문에. MS는 유니코드에 다음 문자가 유니코드임을 나타내고 빅엔디안 또는 리틀엔디안을 식별하는 부팅 플래그(UCS-2LE FFFE, UCS-2BE FEFF)가 있다고 주장합니다. 따라서 Windows 플랫폼에서 들어오는 데이터에 이 접두사가 있는 것으로 밝혀지면 당황하지 마십시오.

5. 파일 출력이나 printf 출력과 같은 Linux 인코딩 출력에는 콘솔에서 적절한 인코딩 일치가 필요합니다(인코딩이 일치하지 않으면 일반적으로 프로그램으로 컴파일(당시 인코딩과 여러 관계가 있음), 콘솔의 변환 입력은 현재 시스템 인코딩을 확인해야 합니다. 예를 들어, 콘솔의 현재 인코딩이 UTF-8인 경우 UTF-8로 인코딩된 항목은 올바르게 표시될 수 있지만 GBK는 유사하게 현재 인코딩이 GBK인 경우 GBK 인코딩이 표시될 수 있습니다. . 최신 시스템은 더 많은 전환을 더 스마트하게 처리해야 합니다. 그러나 퍼티와 같은 터미널을 통해 문자 깨짐 문제를 제거하려면 여전히 터미널의 인코딩 변환을 설정해야 합니다.

PHP를 사용하여 유니코드를 UTF-8로 변환하는 위의 구현 방법(권장)은 모두 편집기에서 공유한 내용이므로 참고할 수 있기를 바라며, PHP 중국어 웹사이트도 지원해 주시길 바랍니다. .

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