이전 버전에서 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
그의 말 중 하나를 인용하자면: 커피와 콜라를 준비하고, 준비하세요. 몇 시간이 걸릴 수도 있습니다...