복붙노트

UTF-8 끝까지

PHP

UTF-8 끝까지

새 서버를 설치하고 웹 응용 프로그램에서 UTF-8을 완벽하게 지원하려고합니다. 나는 기존의 서버에서 과거에 시도해 왔으며 항상 ISO-8859-1로 돌아 가야만하는 것처럼 보입니다.

인코딩 / 문자셋을 정확히 설정해야하는 곳은 어디입니까? 나는 이것을하기 위해 아파치, MySQL, PHP를 설정해야한다는 것을 알고있다 - 따라 할 수있는 표준 체크리스트가 있는가, 아니면 불일치가 발생하는 곳에서 문제를 해결할 것인가?

이것은 MySQL 5, PHP 5 및 Apache 2를 실행하는 새로운 Linux 서버용입니다.

해결법

  1. ==============================

    1.

    데이터 저장고:

    데이터 접근:

    산출:

    입력:

    기타 코드 고려 사항 :

  2. ==============================

    2.

    나는 chazomaticus '우수 답변에 한 가지를 추가하고 싶습니다 :

    META 태그도 잊지 마세요 (HTML4 또는 XHTML 버전).

    <meta charset="utf-8">
    

    그것은 사소한 것처럼 보이지만, IE7은 이전에 저에게 문제점을 제공했습니다.

    나는 모든 것을 올바르게하고 있었다. 데이터베이스, 데이터베이스 연결 및 Content-Type HTTP 헤더가 모두 UTF-8로 설정되었고 다른 모든 브라우저에서 제대로 작동했지만 Internet Explorer는 여전히 "서유럽"인코딩 사용을 주장했습니다.

    페이지에서 META 태그가 누락되었습니다. 추가로 문제가 해결되었습니다.

    편집하다:

    W3C는 실제로 I18N 전용의 큰 섹션을 가지고 있습니다. 이 기사에는 HTTP, (X) HTML 및 CSS 측면을 설명하는 다음과 같은 여러 가지 기사가 있습니다.

    HTTP 헤더와 HTML 메타 태그 (또는 XML로 제공되는 XHTML의 경우 XML 선언)를 모두 사용하는 것이 좋습니다.

  3. ==============================

    3.

    php.ini에서 default_charset을 설정하는 것 외에도, 출력하기 전에 코드에서 header ()를 사용하여 올바른 charset을 보낼 수 있습니다.

    header('Content-Type: text/html; charset=utf-8');
    

    PHP에서 유니 코드로 작업하는 것은 대부분의 문자열 함수가 유니 코드에서 작동하지 않으며 일부 문자열이 완전히 망가질 수 있다는 것을 알고있는 한 쉽습니다. PHP는 "문자"를 1 바이트로 간주합니다. 때로는 괜찮습니다. 예를 들어, explode ()는 바이트 시퀀스를 찾아 구분 기호로 사용합니다. 따라서 실제 문자를 찾지 않아도됩니다. 그러나 실제로 함수가 문자를 처리하도록 설계된 경우 PHP는 텍스트에 유니 코드에서 찾을 수있는 멀티 바이트 문자가 있는지 전혀 모릅니다.

    체크인 할 수있는 좋은 도서관은 phputf8입니다. 이렇게하면 "나쁜"모든 함수가 다시 작성되므로 UTF8 문자열을 안전하게 작업 할 수 있습니다. mbstring 확장 기능과 같은 확장 기능도 있지만이 기능은 라이브러리를 사용하는 편이 좋지만 라이브러리를 더 많이 사용하기 때문에 라이브러리를 사용하는 것이 더 좋습니다 (그러나 대량 시장 제품을 작성하므로 중요합니다). 그러나 phputf8은 성능 향상을 위해 mbstring을 사용할 수 있습니다.

  4. ==============================

    4.

    오래된 주제, 알아. PDO를 사용하는 사람과 관련된 문제를 발견했으며 이에 대한 대답은 PDO 연결 문자열에 이것을 사용하는 것이 었습니다.

    $pdo = new PDO(
        'mysql:host=mysql.example.com;dbname=example_db',
        "username",
        "password",
        array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
    

    내가 이것을 가져간 사이트가 다운되었으므로 운 좋게 Google 캐시를 사용하여 얻을 수있었습니다.

  5. ==============================

    5.

    제 경우에는 정규 표현식을 사용하는 mb_split을 사용하고있었습니다. 따라서 mb_regex_encoding ( 'UTF-8')을 수행하여 정규 표현식 인코딩이 utf-8인지 수동으로 확인해야했습니다.

    부수적으로, mb_internal_encoding ()을 실행하여 내부 인코딩이 utf-8이 아니며 mb_internal_encoding ( "UTF-8");을 실행하여이를 변경했다고도 확인했습니다.

  6. ==============================

    6.

    우선 당신이 <5.3PHP이면 아니오. 문제를 해결하는 데 엄청난 문제가 있습니다.

    나는 누구도 intl 라이브러리, 유니 코드, graphemes, 문자열 연산, 지역화 등을 잘 지원하는 라이브러리에 대해서는 언급하지 않았다는 점에 놀랐다.

    PHP 베네룩스 14에서 엘리자베스 스미스 (Elizabeth Smith)의 슬라이드를 통해 PHP에서 유니 코드 지원에 대한 정보를 인용 할 것입니다.

    좋은:

    나쁜:

    사물이 추가 된 기능 등을 변경하는 경우이 답변을 업데이트하겠습니다.

  7. ==============================

    7.

    최근에 strtolower ()를 사용하면 특수 문자 다음에 데이터가 잘리는 문제가 발생할 수 있음을 발견했습니다.

    해결책은

    mb_strtolower($string, 'UTF-8');
    
  8. ==============================

    8.

    이 놀라운 답변을 추가 할 수있는 유일한 방법은 utf8 인코딩으로 파일을 저장하는 것을 강조하는 것입니다. 브라우저가 utf8을 코드 인코딩으로 설정하는 것보다이 속성을 허용한다는 사실을 알고 있습니다. 괜찮은 텍스트 편집기는 이것을 보여줄 것입니다. 예를 들어 Notepad ++는 파일 enconding을위한 메뉴 옵션을 가지고 있습니다. 현재 인코딩을 보여주고 변경할 수 있습니다. 내 모든 PHP 파일에 대해 BOM없이 utf8을 사용합니다.

    언젠가 전에 누군가가 나를 다른 사람이 설계 한 PHP / MySQL 응용 프로그램에 대한 utf8 지원을 추가하도록 요청 했었습니다. 모든 파일이 ANSI로 인코딩 되었기 때문에 ICONV를 사용하여 모든 파일을 변환하고 데이터베이스 테이블을 사용하여 utf8 charset 및 utf8_general_ci를 한 부씩 인쇄하고 연결 후 데이터베이스 추상화 계층에 'SET NAMES utf8'을 추가하십시오 (그렇지 않으면 5.3.6 또는 이전 버전을 사용하는 경우 연결 문자열에서 charset = utf8을 사용해야 함). 그리고 PHP 멀티 바이트를 사용하도록 문자열 함수를 변경하십시오 문자열 함수는 이에 상응합니다.

  9. ==============================

    9.

    PHP에서는 멀티 바이트 함수를 사용하거나 mbstring.func_overload를 켜야합니다. 그렇게하면 1 바이트 이상을 사용하는 문자가있는 경우 strlen과 같은 기능이 작동합니다.

    또한 응답의 문자 집합을 식별해야합니다. 위와 같이 AddDefaultCharset을 사용하거나 헤더를 반환하는 PHP 코드를 작성할 수 있습니다. (또는 HTML 문서에 META 태그를 추가 할 수 있습니다.)

  10. ==============================

    10.

    나는 단지 같은 문제를 겪었으며 PHP 매뉴얼에서 좋은 해결책을 발견했다.

    내 모든 파일 인코딩을 UTF8로 변경 한 다음 연결의 기본 인코딩을 변경했습니다. 이것은 모든 문제를 해결했습니다.

    if (!$mysqli->set_charset("utf8")) {
        printf("Error loading character set utf8: %s\n", $mysqli->error);
    } else {
       printf("Current character set: %s\n", $mysqli->character_set_name());
    }
    

    소스보기

  11. ==============================

    11.

    처음부터 가지고있는 좋은 목표 - 사이트의 성격에 따라 인터넷에 대한 많은 리소스를 발견했습니다. 물론 처음으로 다루는 것은 아닙니다.

    신비한 PHP6은이 모든 것을 곧바로 처리해야합니다. 맞습니까?

    utf-8을 서버 수준에서 mysql의 글로벌 기본 charset으로 설정하면 세분화 된 수준으로 적절하게 기본 설정됩니다.

  12. ==============================

    12.

    PHP의 유니 코드 지원은 여전히 ​​큰 혼란입니다. 그것이 내부적으로 사용하는 ISO8859 문자열을 utf8로 변환 할 수는 있지만 유니 코드 문자열을 기본적으로 사용할 수있는 기능이 부족합니다. 즉, 모든 문자열 처리 함수가 문자열을 조작하고 손상시킬 수 있습니다. 따라서 적절한 utf8 지원을 위해 별도의 라이브러리를 사용하거나 모든 문자열 처리 함수를 직접 다시 작성해야합니다.

    쉬운 부분은 HTTP 헤더와 데이터베이스 등에서 charset을 지정하는 것뿐입니다. PHP 코드가 유효한 UTF8을 출력하지 않으면 문제가되지 않습니다. 그것은 어려운 부분이며, PHP는 사실상 아무런 도움을주지 못합니다. (필자는 PHP6가이 최악의 상황을 고쳐야한다고 생각하지만, 아직 멀어져있다.)

  13. ==============================

    13.

    최고 대답은 우수합니다. 다음은 정규 debian / php / mysql 설정에서했던 것입니다.

    // storage
    // debian. apparently already utf-8
    
    // retrieval
    // the mysql database was stored in utf-8, 
    // but apparently php was requesting iso. this worked: 
    // ***notice "utf8", without dash, this is a mysql encoding***
    mysql_set_charset('utf8');
    
    // delivery
    // php.ini did not have a default charset, 
    // (it was commented out, shared host) and
    // no http encoding was specified in the apache headers.
    // this made apache send out a utf-8 header
    // (and perhaps made php actually send out utf-8)
    // ***notice "utf-8", with dash, this is a php encoding***
    ini_set('default_charset','utf-8');
    
    // submission
    // this worked in all major browsers once apache
    // was sending out the utf-8 header. i didnt add
    // the accept-charset attribute.
    
    // processing
    // changed a few commands in php, like substr,
    // to mb_substr
    

    그게 전부였다 !

  14. ==============================

    14.

    MySQL 서버가 클라이언트가 아닌 PHP (character set)를 클라이언트로 결정하기를 원한다면 (필자의 의견으로는, 필자의 의견으로는 선호), mysqld 아래의 my.cnf에 skip-character-set-client-handshake를 추가하고 mysql을 재시작하십시오.

    이것은 UTF8 이외의 것을 사용하는 경우 문제를 일으킬 수 있습니다.

  15. from https://stackoverflow.com/questions/279170/utf-8-all-the-way-through by cc-by-sa and MIT lisence