php5.4 이상 버전의 GBK 인코딩에서 htmlspecialchars 출력이 비어 있는 문제에 대한 솔루션 요약_php 팁

WBOY
풀어 주다: 2016-05-16 20:18:22
원래의
2173명이 탐색했습니다.

이전 버전에서 php5.4로 업그레이드할 때 가장 고민되는 문제가 htmlspecialchars인 것 같아요! 물론 htmlentities도 영향을 받습니다. 그러나 중국 웹사이트의 경우 htmlspecialchars를 사용하는 것이 더 일반적이며 htmlentities는 거의 사용되지 않습니다.

아마도 외국인들은 웹페이지가 일반적으로 UTF-8로 인코딩되어야 한다고 생각해서 GB2312, GBK 인코딩을 사용하는 중국 웹사이트 때문에 고생하시는 분들이 많을 텐데요...!

구체적인 성과:

코드 복사 코드는 다음과 같습니다.

$str = "9enjoy.com의 PHP 버전은 5.2.10입니다.";
echo htmlspecialchars($str);

gbk 문자 세트 아래의 출력은 비어 있습니다. utf-8에서는 출력이 정상입니다.

이유는 5.4.0에서 이 기능이 변경되었기 때문입니다.

코드 복사 코드는 다음과 같습니다.

5.4.0 인코딩 매개변수의 기본값이 UTF-8로 변경되었습니다.

그것은 무엇이었나요?
코드 복사 코드는 다음과 같습니다.

string htmlspecialchars ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = 'UTF-8' [, bool $double_encode = true ]]] )

변환에 사용되는 인코딩을 정의합니다. 생략할 경우 이 인수의 기본값은 PHP 5.4.0 이전 버전에서는 ISO-8859-1이고 PHP 5.4.0 이상에서는 UTF-8입니다.


ISO-8859-1로 밝혀졌지만 5.4 이후에는 기본적으로 utf-8이 되었습니다! 그런 다음 이 기능을 중국어로 사용하면 출력이 공백이 됩니다.

국내 오픈소스 프로그램 중 상당수가 5.4에서 이런 문제를 겪게 됩니다. DISCUZ 관계자도 사용자들에게 5.4로 업그레이드하지 말 것을 권고하고 있습니다

해결책:

1. htmlspecialchars를 사용하는 모든 프로그램은 거의 수정하지 않습니다

1.1 두 번째 $flags 매개변수의 기본값은 ENT_COMPAT이므로
으로 변경됩니다.

코드 복사 코드는 다음과 같습니다.

htmlspecialchars($str,ENT_COMPAT,'GB2312');

GBK는 왜 안되나요? GBK 매개변수가 없기 때문에 GBK를 강제로 사용하면 다음과 같은 오류가 보고됩니다.
코드 복사 코드는 다음과 같습니다.

경고: htmlspecialchars(): utf-8을 가정하면 `gbk' 문자 세트가 지원되지 않습니다

GBK를 사용하려면 다음과 같이 변경하세요.
코드 복사 코드는 다음과 같습니다.

htmlspecialchars($str,ENT_COMPAT,'ISO-8859-1');

1.2. 동일한 절차가 변경되지만, 하나의 매개변수가 생략될 수 있습니다.
웹 페이지 헤드에
을 추가할 수 있습니다.
코드 복사 코드는 다음과 같습니다.

ini_set('default_charset','gbk');

그런 다음
으로 변경하세요.
코드 복사 코드는 다음과 같습니다.

htmlspecialchars($str,ENT_COMPAT,'');

문서에는 다음과 같이 명시되어 있습니다. 빈 문자열은 스크립트 인코딩(Zend 멀티바이트), default_charset 및 현재 로케일(nl_langinfo() 및 setlocale() 참조)에서 이 순서대로 감지를 활성화합니다.
일반적인 의미는 다음과 같습니다. 빈 문자열이 전달되면 default_charset의 인코딩이 사용됩니다.

1.3. 함수 캡슐화... htmlspecialchars라는 단어는 항상 기억하기 어려웠습니다.

코드 복사 코드는 다음과 같습니다.

함수 htmlout($str) {
htmlspecialchars($str,ENT_COMPAT,'ISO-8859-1') 반환;
}

그런 다음 일괄 교체로 이동합니다.

2. 소스코드를 직접 수정하고 다시 컴파일해보세요! 이는 제가 현재 온라인에서 진행하고 있는 계획이기도 합니다.
ext/standard/html.c 수정
372행 소개

코드 복사 코드는 다음과 같습니다.

/* 기본값은 이제 UTF-8입니다 */
if (charset_hint == NULL)
return cs_utf_8;

cs_utf_8을 cs_8859_1로 변경
코드 복사 코드는 다음과 같습니다.

/* 기본값은 이제 UTF-8입니다 */
if (charset_hint == NULL)
반환 cs_8859_1;

컴파일 후에는 원본 프로그램을 어떤 방식으로든 조정할 필요가 없습니다.
설치방법은 http://www.jb51.net/article/63388.htm을 참고하세요.

Windows에서는 어떻게 해야 하나요? 이걸 스스로 컴파일하는 방법을 찾아보자. 꽤 어렵다...
참고용 URL 제공: http://www.jb51.net/article/63391.htm
그의 말 중 하나를 인용하자면: 커피와 콜라를 준비하고, 준비하세요. 몇 시간이 걸릴 수도 있습니다...

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿