>  기사  >  백엔드 개발  >  PHP의 한자 인코딩 변환 방법에 대한 심층 설명

PHP의 한자 인코딩 변환 방법에 대한 심층 설명

WBOY
WBOY원래의
2016-07-25 08:53:461020검색
이 글은 PHP의 한자 인코딩 변환에 대한 지식을 소개하고 PHP 인코딩 변환의 원리와 방법을 분석하여 도움이 필요한 친구들이 참고할 수 있도록 합니다.

mysql4.1 문자 집합에 대한 이해와 관련하여, mysql에서 이러한 변화에 PHP가 어떻게 적응하는지 이야기해 보겠습니다. mysql5 이상 버전에도 적용 가능합니다.

1. 원칙 MySQL의 문자 집합에는 두 가지 개념이 있는데, 하나는 "문자 집합(character set)"이고 다른 하나는 "collations"입니다. 1. 데이터 정렬 콜레이션은 중국어로 "검증"으로 번역됩니다. 이 용어는 MySQL에서만 사용됩니다. 예를 들어, ASCII 문자 세트에서 콜레이션은 a가 다음과 같다고 규정합니다. b보다 작습니다. a는 a와 같고, a는 a와 같은지 여부입니다. 일반적으로 각 문자 집합에는 기본 데이터 정렬이 있으므로 기본적으로 데이터 정렬의 존재를 무시할 수 있습니다. 2.캐릭터 세트 대조적으로, 문자 세트는 더 넓은 개념입니다. Windows의 일반 텍스트 파일에도 문자 세트 문제가 있습니다. 다양한 문자 세트는 다양한 문자 인코딩 방법을 지정합니다. 문자 집합은 기호 및 인코딩의 집합입니다. 예를 들어 ASCII 문자 집합에는 숫자, 대문자 및 소문자와 같은 문자, 세미콜론 및 줄바꿈과 같은 기호가 포함됩니다. 인코딩 방법은 문자( a의 인코딩은 65이고 b의 인코딩은 98입니다. ASCII는 영어 문자의 인코딩만을 규정하고 있으며, 영어가 아닌 언어는 ASCII 인코딩으로 표현할 수 없습니다. 예를 들어 우리나라는 gb2312 인코딩을 사용합니다. 그러나 국가마다 인코딩이 다르고 크로스 플랫폼 문제도 있습니다. 이러한 이유로 일부 국제 표준 기관에서는 국제적으로 허용되는 인코딩을 개발했으며 가장 일반적으로 사용되는 인코딩은 utf8입니다. ascii는 영문 기호와 영문자만 인코딩하고, gb2312는 영문 기호, 영문자, 한자를 인코딩하며, utf8은 전 세계 모든 언어를 인코딩하므로 gb1212 문자에는 ascii 문자가 포함되고, utf8에는 gb2312 문자가 포함됩니다. utf8은 가장 넓은 범위의 문자를 포함하는 문자 집합임을 알 수 있습니다. 따라서 일부 다국어 웹 시스템에서는 일반적으로 utf8 문자 집합이 사용됩니다(phpmyadmin은 utf8 인코딩을 사용함). 모든 텍스트의 저장에는 문자 집합의 개념이 포함됩니다. 데이터베이스 및 일반 텍스트 파일을 포함합니다.

주요 용어: 문자 : 한자, 영문자, 문장부호, 라틴어 등 인코딩: 문자를 컴퓨터 저장 형식으로 변환합니다. 예를 들어 a는 65로 표시됩니다. 문자 집합: 문자 집합과 해당 인코딩 방법입니다. 가. mysql 문자셋 MySQL은 현재 여러 문자 집합을 지원하고 다양한 문자 집합 간의 변환을 지원합니다(이식성을 용이하게 하고 다중 언어를 지원하기 위해). MySQL은 서버 수준 문자 집합, 데이터베이스 수준 문자 집합, 데이터 테이블 수준 문자 집합, 테이블 열 문자 집합을 설정할 수 있습니다. 실제로 문자 집합이 사용되는 마지막 장소는 문자를 저장하는 열입니다. table1의 col1 열을 문자 유형으로 설정하면 col1은 문자 집합만 사용합니다. table1 테이블의 col2 열이 int 유형인 경우 col2는 문자 집합의 개념을 사용하지 않습니다. 서버 수준 문자 집합, 데이터베이스 수준 문자 집합 및 데이터 테이블 수준 문자 집합은 모두 열 문자 집합의 기본 옵션입니다. MySQL에는 시작 시, 컴파일 중 또는 구성 파일에서 매개변수를 추가하여 지정할 수 있는 문자 세트가 있어야 합니다. mysql 서버 문자 집합은 단지 데이터베이스 수준의 기본값입니다. 데이터베이스 생성 시 문자셋을 지정할 수 있습니다. 지정하지 않으면 서버의 문자셋이 사용됩니다. 마찬가지로 테이블을 생성할 때 테이블 수준의 문자 집합을 지정할 수 있습니다. 지정하지 않으면 데이터베이스 문자 집합이 테이블 문자 집합으로 사용됩니다. 컬럼을 생성할 때 컬럼의 문자셋을 지정할 수 있다. 지정하지 않으면 테이블의 문자셋이 사용된다. 일반적으로 서버 수준 문자 집합만 설정하면 됩니다. 다른 데이터베이스 수준, 테이블 수준 및 열 수준 문자 집합은 서버 수준 문자 집합에서 상속됩니다. utf8은 가장 넓은 문자 집합이므로 일반적인 상황에서는 mysql 서버 수준 문자 집합을 utf8로 설정합니다!

b. 일반 텍스트의 문자 집합 문제 모든 텍스트 저장에는 문자 집합 문제가 있으며 일반 텍스트 파일도 예외는 아닙니다. Windows 2000 시스템에서는 메모장을 열고 "다른 이름으로 저장..." 대화 상자에 텍스트 저장을 위한 인코딩 방법을 선택할 수 있는 옵션이 있습니다. 일반적으로 모든 사람이 Windows 2000 시스템을 사용하고 기본 인코딩을 사용하므로 문자 집합 문제는 없습니다. Windows에서는 텍스트 파일을 저장할 때 인코딩 방법을 선택할 수 있지만, 텍스트 파일을 열면 인코딩 방법이 자동으로 결정됩니다. Windows 2000 메모장을 사용하여 China Mobile 및 China Unicom에서 검색할 수 있다는 농담이 인터넷에 있습니다. Windows가 텍스트 파일을 열 때 잘못된 인코딩 판단으로 인해 문제가 발생합니다. 인코딩의 자동 판단은 때때로 실수를 하기 때문에 일부 텍스트 파일은 자체적으로 사용되는 인코딩을 식별하는 방법을 지정합니다. html 파일이 그러한 예 중 하나입니다. html은 텍스트 파일입니다. html 파일을 저장할 때 인코딩을 사용해야 하며, html 파일에서는 html 구문을 사용하여 파일에서 사용하는 인코딩을 지정하기도 합니다(예:). html 파일이 인코딩을 지정하지 않으면 브라우저는 자동으로 파일의 인코딩을 식별합니다. html이 인코딩을 지정하면 브라우저는 html로 지정된 인코딩을 사용합니다. 일반적으로 HTML 파일에 지정된 문자 세트는 HTML 파일 자체의 인코딩과 일치하지만 불일치도 있습니다. 일치하지 않으면 웹 페이지가 깨집니다. 여기서 깨져 있는 코드는 텍스트 파일에만 관련되어 있으며 데이터베이스와는 아무 관련이 없습니다.) 특수 웹 페이지 편집 도구(예: dreamwave)를 사용하면 웹 페이지의 문자 세트 값을 기반으로 파일을 자동으로 인코딩합니다.

c.php mysql의 문자셋 문제 PHP가 최종적으로 생성하는 것은 텍스트 파일이지만 데이터베이스에서 텍스트를 검색하거나 텍스트를 데이터베이스에 저장해야 합니다. MySQL은 기본적으로 여러 문자 세트를 지원하므로 MySQL은 PHP가 어떤 문자 세트를 전송하는지 알지 못합니다. 따라서 MySQL은 클라이언트(php)가 어떤 문자 세트에 액세스하는지 알려 주어야 합니다. Character_set_client를 설정함으로써 PHP는 PHP가 데이터베이스에 저장하는 인코딩 방법을 mysql에 알려줍니다. Character_set_results를 설정함으로써, PHP는 PHP가 어떤 종류의 인코딩된 데이터를 얻어야 하는지를 mysql에 알려줍니다. Character_set_connection을 설정하면 PHP는 PHP 쿼리의 텍스트에 사용할 인코딩을 mysql에 알려줍니다. mysql은 설정된 인코딩을 사용하여 텍스트를 저장합니다. MySQL이 setserver를 사용하여 텍스트를 저장하고, PHP의 Character_set_client가 setclient이고, PHP의 Character_set_results가 setresult라고 가정합니다. 그러면 mysql은 php에서 전송된 텍스트를 setclient 인코딩 방식에서 setserver 인코딩 방식으로 변환한 후 데이터베이스에 저장하고, php가 해당 텍스트를 검색하면 mysql은 해당 텍스트를 setserver에서 setresult로 변환한 후 php로 보낸다. php 파일(최종 생성된 html 파일) 자체에 코드가 있습니다. mysql이 전달한 코드가 php 파일 자체의 코드와 다르면 전체 웹 페이지가 깨집니다. 따라서 PHP는 일반적으로 MySQL에게 자체 인코딩 방법을 알려줍니다. 왜곡된 코드가 없는지 확인하려면 세 가지 코드를 통일해야 합니다. 하나는 웹 페이지 자체의 코드, 다른 하나는 HTML에 지정된 코드, 세 번째는 PHP가 mysql에 알려주는 코드(character_set_client 및 문자_세트_결과). 첫 번째와 두 번째 코드는 일반적으로 dw와 같은 편집기를 사용하여 웹페이지를 작성하는 경우 일관성이 있지만, 메모장을 사용하여 웹페이지를 작성하는 경우에는 일관성이 없을 수 있습니다. 세 번째 인코딩에는 mysql에 수동으로 알림이 필요합니다. 이 단계는 PHP에서 mysql_query("set names Characterx")를 사용하여 수행할 수 있습니다.

d.문자셋 변환 문제 작은 문자 세트를 큰 문자 세트로 변환하면 데이터가 손실되지 않지만, 큰 문자 세트를 작은 문자 세트로 변환하면 데이터가 손실될 수 있습니다. 예를 들어, utf8의 일부 문자는 gb2312에 없을 수 있으므로 utf8에서 gb2312로 변환할 때 일부 문자가 손실될 수 있습니다. 하지만 예외가 있습니다. 먼저 gb2312에서 utf8로 변환한 다음 utf8에서 gb2312로 변환합니다. 이 경우 처음에 변환된 텍스트는 모두 gb2312의 문자이므로 전체 프로세스가 손실되지 않습니다. 변환 중인 gb2312의 문자이며 손실되지 않습니다. utf8은 전 세계의 모든 문자를 수용할 수 있으므로 데이터베이스는 일반적으로 utf8 인코딩을 사용합니다. 이를 통해 모든 문자를 UTF8로 인코딩된 데이터베이스에 저장할 수 있습니다.

e.phpmyadmin이 왜곡된 문제 phpmyadmin은 여러 언어를 지원하므로 utf8 인코딩을 사용하려면 html 페이지가 필요합니다. html 페이지는 utf8 인코딩을 사용합니다. 이를 위해서는 phpmyadmin이 mysql에 연결할 때 Character_set_client 및 Character_set_results에 대해 utf8 인코딩을 사용해야 합니다. 현재 상황에서 PHP는 MySQL에 연결할 때 인코딩 방법을 MySQL에 알리기 위해 세트 이름(또는 다른 여러 명령문)만 사용할 수 있습니다. 선언된 명시적인 인코딩 방법이 없으면 latin1 인코딩이 사용됩니다. 일반 프로그램은 Character_set_client 변수를 명시적으로 선언하지 않으므로 gb2312 텍스트는 latin1 인코딩으로 데이터베이스에 저장되고 phpmyadmin은 이를 utf8 형식으로 읽으므로 확실히 왜곡됩니다. PHP 프로그램이 올바른 인코딩으로 데이터베이스에 저장되면 아무런 문제가 없습니다. 따라서 수정해야 할 것은 phpmyadmin이 아닙니다. (때때로 phpmyadmin을 수정하면 잘못된 문제가 해결될 수도 있지만 이것이 문제의 근본은 아닙니다.)

2. 요약

1. 데이터베이스에 utf8 저장소를 사용해 보십시오(/etc/my.cnf를 수정하고 [mysqld] 섹션에 default-character-set=utf8 추가). (기존 데이터베이스, 먼저 utf8 형식으로 변환) 2. 데이터베이스를 쿼리하기 전에 PHP 프로그램은 mysql_query("set names xxxx")를 실행합니다. 여기서 xxxx는 웹 페이지의 인코딩입니다(charset=xxxx). 웹 페이지에서 charset=utf8이면 xxxx=utf8입니다. 웹 페이지의 charset=gb2312, xxxx=gb2312, 웹 페이지의 charset=ipaddr이면 xxxx=ipaddr(농담입니다. 해당 인코딩은 없습니다) 거의 모든 웹 프로그램에는 데이터베이스에 연결하기 위한 공통 코드가 파일에 포함되어 있습니다. 이 파일에 mysql_query("세트 이름")만 추가하면 됩니다. 3.phpmyadmin은 수정할 필요가 없습니다. 4. 웹 페이지의 실제 인코딩(Windows 저장 대화 상자의 인코딩)이 선언된 인코딩(charset=?)과 일치하는지 확인하려면 dw와 같은 도구를 사용하여 웹 페이지를 생성하십시오.



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