웹 개발에는 종종 프런트 엔드 웹 페이지(PHP - MySQL) 간의 데이터 상호 작용이 포함됩니다. 데이터가 영어로만 있을 때는 보통 문제가 없는데, 중국어의 경우 세 곳의 문자 인코딩이 일치하지 않습니다. (예를 들어 웹 페이지에서는 gbk를 사용하고 mysql에서는 utf-8을 사용하는 경우) , 문자가 깨질 수 있습니다
(참고: 문자 인코딩에 대해서는 Baidu 백과사전: http://baike.baidu.com/view/1204863.htm?fr=aladdin을 참조하십시오)
프론트 엔드 웹 페이지 인코딩:
보통 우리 모두는
태그 메타> 항목(예: ) 전체 페이지의 문자 인코딩을 설정합니다. 대부분의 페이지는 이 방법을 사용하여 브라우저에 알릴 수 있습니다. 브라우저가 이 페이지를 표시할 때 어떤 인코딩이 사용되지만 때때로 이 문장이 여전히 작동하지 않는 경우가 있습니다. 어떤 xxx인지에 관계없이 브라우저는 항상 동일한 인코딩을 사용합니다.이 상황은 http와 관련이 있습니다. 실제로 사용자가 웹 페이지를 탐색할 때 서버가 사용자에게 보내는 콘텐츠에는 다음이 포함됩니다. 우리 웹 페이지(html/css/js와 같은 코드 콘텐츠 포함)뿐만 아니라 클라이언트에게 수신할 데이터 유형(HTML, 일반 텍스트, 멀티미디어 파일 등), 크기, 소스 및 기타 정보(이 정보를 보려면 텔넷 도구를 사용할 수 있습니다(브라우저를 사용하는 대신 http 프로토콜에 따라 직접 요청 가져오기를 시작해 보십시오.).) html의 일부인 는 헤더보다 우선순위가 낮습니다. 웹페이지의 문자 인코딩에 대한 설명이 포함되어 있으므로 브라우저는 결국 헤더에 지정된 문자 인코딩 세트에 따라 웹 페이지를 구문 분석합니다.
PHP에서는 header("content-type:text/html; charset=xxx. ")를 사용하여 문자 세트에 대한 헤더를 보낼 수 있습니다.
Apache 서버의 경우 AddDefaultCharset 기능이 있습니다. 즉, 전송된 각 웹 페이지에 대한 서버의 기본 문자 집합에 따라 해당 헤더가 설정됩니다.
/etc/apache2/httpd.conf를 확인하세요(2.4 이전). ) 또는 /etc/apache2/conf-available/charset.conf (2.4 이상) AddDefaultCharset xxx라는 문장이 있습니다. 이 문장에 주석이 없으면 각 웹 페이지에 기본 문자 집합 헤더를 추가하는 기능이 있습니다. 이 때 태그에 설정된 문자만 설정하면 아무런 효과가 없습니다.
참고: HTML 페이지에 표시된 인코딩 방법은 실제로 HTML 페이지(실제로는 일반 텍스트)를 저장하는 데 사용되는 인코딩 방법과 일치해야 합니다.
일반적으로 중국어 및 더 많은 다른 언어와 호환하려면 utf-8 인코딩을 사용하는 것이 가장 쉬운 방법입니다. utf-8은 세계에서 일반적으로 사용되는 거의 모든 언어를 지원하기 때문입니다.
mysql 데이터베이스 인코딩:
터미널에서 mysql -uusername -ppassword를 입력한 다음 mysql 제어 프로그램을 입력하고 'character%'와 같은 변수 표시를 입력합니다. sql 문을 mysql 터미널에 입력) 생략 가능) 다음과 유사한 그림을 볼 수 있습니다.
위에는 mysql이 다양한 수준에서 사용하는 문자 집합이 나열되어 있으며 그 중 (*)
character-set- server/default-character-set: 기본적으로 사용되는 서버 문자 집합입니다.
character-set-database: 데이터베이스 문자 집합입니다.
character-set-table: 데이터베이스 테이블 문자 집합입니다.
우선순위가 순차적으로 높아집니다. 따라서 일반적으로 캐릭터셋-서버만 설정하면 되고, 데이터베이스 및 테이블 생성 시에는 캐릭터셋을 지정하지 않아도 된다. 이런 방식으로 캐릭터셋-서버 캐릭터셋을 일률적으로 사용하게 된다.
character-set-client: 클라이언트의 문자 집합입니다. 클라이언트 기본 문자 집합입니다. 클라이언트가 서버에 요청을 보낼 때 요청은 이 문자 집합으로 인코딩됩니다.
character-set-results: 결과 문자 집합입니다. 서버가 결과나 정보를 클라이언트에 반환할 때 결과는 이 문자 집합으로 인코딩됩니다.
클라이언트 측에서 문자 세트 결과가 정의되지 않은 경우 문자 세트 클라이언트 문자 세트가 기본 문자 세트로 사용됩니다. 따라서 문자 세트-클라이언트 문자 세트만 설정하면 됩니다.
그래서 위 그림에 표시된 문자 집합 서버는 utf8을 사용하지 않음을 알 수 있습니다(참고: mysql에서는 utf-8 인코딩 방법이 "-" 없이 utf8로 표현됩니다). mysql의 기본 저장 방식이 latin1이기 때문에 수정하지 않고 사용하면 됩니다. 이 경우 mysql 터미널을 사용하여 데이터베이스와 데이터 테이블을 생성할 때 사용된 문자 집합이 sql 문에 지정되어 있지 않으면 저장에 사용되는 인코딩은 latin1이 됩니다. 분명히 한자는 원래 이 인코딩 방법으로 저장됩니다. 라틴어 텍스트를 저장하는 데 사용되는 텍스트는 표시될 때 확실히 왜곡됩니다.
그렇다면 어떻게 수정하면 되나요? set Character-set-server = utf8;을 사용하면 됩니다(character-set-server는 우선순위가 높기 때문에 수정하는 것만으로도 데이터베이스 저장 인코딩 방법을 수정하는 효과를 얻을 수 있습니다). 이후 SQL을 사용하여 터미널에서 테이블을 생성할 때 테이블의 저장 인코딩 방법은 UTF-8입니다.
그러나 이 수정 사항은 현재 서비스에만 적용됩니다. quit;를 사용하여 mysql 터미널을 종료하고 다시 입력하면 문자 집합이 다시 latin1로 변경된 것을 확인할 수 있습니다. 지금까지 제가 찾은 정보에 따르면 변경 사항을 영구적으로 적용하는 방법은 mysql을 다시 컴파일할 때 컴파일 매개 변수를 수정해야만 가능하다는 것을 알 수 있습니다. 컴파일하지 않고 이를 달성하는 방법을 아는 전문가가 있으면 메시지를 남겨 알려 주시기 바랍니다.
php 인코딩:
그렇다면 mysql과 관련하여 PHP는 mysql과 상호 작용할 때 데이터 전송 프로세스 중에 잘못된 문자가 나타나지 않도록 어떻게 보장합니까?
(*)의 설명에 따르면 실제로 mysql에서 데이터를 저장하고 검색할 때 문자 깨짐을 방지하기 위해 다음 세 가지 시스템 매개변수만 서버 문자 집합과 동일하게 설정하면 됩니다. -서버 문자 집합.
character_set_client: 클라이언트의 문자 집합입니다.
character_set_results: 결과 문자 집합입니다.
character_set_connection: 연결 문자 집합입니다.
이 세 가지 시스템 매개 변수 설정은 MySQL에 다음 명령문을 전송하여 수행할 수 있습니다. 이름 설정 xxx(xxx는 utf8일 수 있음)
따라서 중국어 및 기타 영어가 아닌 문자를 php에서 mysql로 보내는 경우 mysql_query(뒤에)를 사용하세요. mysql_connect 문 "set names utf8"); 문(여기에서는 데이터베이스 저장소가 utf8을 사용한다고 가정함)을 사용하면 중국어를 안전하게 전송하고 검색할 수 있습니다.
또한 HTML 페이지는 실제로 PHP에 의해 동적으로 생성될 수 있으므로 PHP에 의해 동적으로 생성된 페이지에서 사용하는 인코딩 방법이 헤더 또는 에 선언된 것과 동일한지 어떻게 확인할 수 있을까요?
php 디렉토리에서 php.ini 파일을 찾아 default_charset = "utf-8"을 수정하여 페이지 출력 시 PHP가 utf-8을 사용하여 인코딩하도록 합니다.
추천 학습: "PHP 비디오 튜토리얼"