복붙노트

인코딩을 감지하고 모든 것을 UTF-8로 만듭니다.

PHP

인코딩을 감지하고 모든 것을 UTF-8로 만듭니다.

저는 다양한 RSS 피드에서 많은 텍스트를 읽고 데이터베이스에 삽입하고 있습니다.

물론 피드에 여러 가지 문자 인코딩이 사용됩니다. UTF-8 및 ISO-8859-1

불행히도, 때때로 텍스트의 인코딩에 문제가 있습니다. 예:

케이스 2와 3을 피하기 위해 무엇을 할 수 있습니까?

모든 것을 UTF-8과 같은 인코딩으로 만들려면 어떻게해야합니까? utf8_encode ()를 사용해야 할 때 언제 utf8_decode ()를 사용해야합니까 (효과가 무엇인지는 분명하지만 언제 기능을 사용해야합니까?) 언제 입력을해야합니까?

당신은 저를 도울 수 있고 모든 것을 동일한 인코딩으로 만드는 방법을 말해 줄 수 있습니까? 아마도 함수 mb_detect_encoding ()을 가지고있을 것인가? 이를 위해 함수를 작성할 수 있습니까? 그래서 내 문제는 :

이 기능이 작동할까요?

function correct_encoding($text) {
    $current_encoding = mb_detect_encoding($text, 'auto');
    $text = iconv($current_encoding, 'UTF-8', $text);
    return $text;
}

나는 그것을 테스트했지만 작동하지 않습니다. 그게 뭐가 잘못 됐어?

해결법

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

    1.이미 UTF8 문자열에 utf8_encode ()를 적용하면 깨진 UTF8 출력이 반환됩니다.

    이미 UTF8 문자열에 utf8_encode ()를 적용하면 깨진 UTF8 출력이 반환됩니다.

    이 모든 문제를 해결하는 함수를 만들었습니다. 그것은 Encoding :: toUTF8 ()입니다.

    문자열의 인코딩이 무엇인지 알 필요가 없습니다. Latin1 (iso 8859-1), Windows-1252 또는 UTF8이 될 수 있으며, 문자열은 이들을 혼합하여 사용할 수 있습니다. Encoding :: toUTF8 ()은 모든 것을 UTF8로 변환합니다.

    나는 서비스가 나에게 모든 문자열을 UTF8과 Latin1을 섞어서 엉망이되는 데이터를 제공했기 때문에 그것을했다.

    용법:

    require_once('Encoding.php'); 
    use \ForceUTF8\Encoding;  // It's namespaced now.
    
    $utf8_string = Encoding::toUTF8($utf8_or_latin1_or_mixed_string);
    
    $latin1_string = Encoding::toLatin1($utf8_or_latin1_or_mixed_string);
    

    다운로드 :

    https://github.com/neitanod/forceutf8

    최신 정보:

    다른 함수 인 Encoding :: fixUFT8 ()을 포함 시켰습니다.이 함수는 깨져 보이는 모든 UTF8 문자열을 수정합니다.

    용법:

    require_once('Encoding.php'); 
    use \ForceUTF8\Encoding;  // It's namespaced now.
    
    $utf8_string = Encoding::fixUTF8($garbled_utf8_string);
    

    예 :

    echo Encoding::fixUTF8("Fédération Camerounaise de Football");
    echo Encoding::fixUTF8("Fédération Camerounaise de Football");
    echo Encoding::fixUTF8("FÃÂédÃÂération Camerounaise de Football");
    echo Encoding::fixUTF8("Fédération Camerounaise de Football");
    

    출력됩니다 :

    Fédération Camerounaise de Football
    Fédération Camerounaise de Football
    Fédération Camerounaise de Football
    Fédération Camerounaise de Football
    

    업데이트 : 필자는 함수 (forceUTF8)를 Encoding이라는 클래스의 정적 함수 계열로 변형했습니다. 새로운 함수는 Encoding :: toUTF8 ()입니다.

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

    2.먼저 어떤 인코딩이 사용되었는지 감지해야합니다. RSS 피드를 파싱 할 때 (아마도 HTTP를 통해), Content-Type HTTP 헤더 필드의 charset 매개 변수에서 인코딩을 읽어야합니다. 존재하지 않으면 XML 처리 명령어의 인코딩 속성에서 인코딩을 읽습니다. 그게 없으면 사양에 정의 된대로 UTF-8을 사용하십시오.

    먼저 어떤 인코딩이 사용되었는지 감지해야합니다. RSS 피드를 파싱 할 때 (아마도 HTTP를 통해), Content-Type HTTP 헤더 필드의 charset 매개 변수에서 인코딩을 읽어야합니다. 존재하지 않으면 XML 처리 명령어의 인코딩 속성에서 인코딩을 읽습니다. 그게 없으면 사양에 정의 된대로 UTF-8을 사용하십시오.

    편집 여기 내가 할 수있는 일이 있습니다 :

    응답을 보내고 가져 오는 데 cURL을 사용합니다. 이를 통해 특정 헤더 필드를 설정하고 응답 헤더도 가져올 수 있습니다. 응답을 가져온 후에는 HTTP 응답을 구문 분석하여 헤더와 본문으로 분할해야합니다. 그런 다음 헤더에는 MIME 유형이 포함 된 Content-Type 헤더 필드와 인코딩 / 문자 세트가 포함 된 charset 매개 변수가 포함되어야합니다. 그렇지 않은 경우 XML PI에서 인코딩 속성의 존재 여부를 분석하고 거기에서 인코딩을 가져옵니다. 또한 이것이 없다면, XML 스펙은 UTF-8을 인코딩으로 사용하도록 정의합니다.

    $url = 'http://www.lr-online.de/storage/rss/rss/sport.xml';
    
    $accept = array(
        'type' => array('application/rss+xml', 'application/xml', 'application/rdf+xml', 'text/xml'),
        'charset' => array_diff(mb_list_encodings(), array('pass', 'auto', 'wchar', 'byte2be', 'byte2le', 'byte4be', 'byte4le', 'BASE64', 'UUENCODE', 'HTML-ENTITIES', 'Quoted-Printable', '7bit', '8bit'))
    );
    $header = array(
        'Accept: '.implode(', ', $accept['type']),
        'Accept-Charset: '.implode(', ', $accept['charset']),
    );
    $encoding = null;
    $curl = curl_init($url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_HEADER, true);
    curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
    $response = curl_exec($curl);
    if (!$response) {
        // error fetching the response
    } else {
        $offset = strpos($response, "\r\n\r\n");
        $header = substr($response, 0, $offset);
        if (!$header || !preg_match('/^Content-Type:\s+([^;]+)(?:;\s*charset=(.*))?/im', $header, $match)) {
            // error parsing the response
        } else {
            if (!in_array(strtolower($match[1]), array_map('strtolower', $accept['type']))) {
                // type not accepted
            }
            $encoding = trim($match[2], '"\'');
        }
        if (!$encoding) {
            $body = substr($response, $offset + 4);
            if (preg_match('/^<\?xml\s+version=(?:"[^"]*"|\'[^\']*\')\s+encoding=("[^"]*"|\'[^\']*\')/s', $body, $match)) {
                $encoding = trim($match[1], '"\'');
            }
        }
        if (!$encoding) {
            $encoding = 'utf-8';
        } else {
            if (!in_array($encoding, array_map('strtolower', $accept['charset']))) {
                // encoding not accepted
            }
            if ($encoding != 'utf-8') {
                $body = mb_convert_encoding($body, 'utf-8', $encoding);
            }
        }
        $simpleXML = simplexml_load_string($body, null, LIBXML_NOERROR);
        if (!$simpleXML) {
            // parse error
        } else {
            echo $simpleXML->asXML();
        }
    }
    
  3. ==============================

    3.인코딩을 감지하는 것은 어렵습니다.

    인코딩을 감지하는 것은 어렵습니다.

    mb_detect_encoding은 여러 후보자를 추측하여 작동합니다. 일부 인코딩에서는 특정 바이트 시퀀스가 ​​유효하지 않으므로 다양한 후보를 구별 할 수 있습니다. 불행하게도, 동일한 바이트가 유효하지만 (다른 경우) 많은 인코딩이 있습니다. 이러한 경우 인코딩을 결정할 방법이 없습니다. 이러한 경우 추측을 위해 자신의 논리를 구현할 수 있습니다. 예를 들어, 일본어 사이트에서 오는 데이터는 일본어 인코딩을 할 가능성이 더 높습니다.

    서유럽 언어 만 다루는 한 고려해야 할 세 가지 주요 인코딩은 utf-8, iso-8859-1 및 cp-1252입니다. 이것들은 많은 플랫폼에서 기본값이기 때문에 잘못보고 될 가능성이 가장 높습니다. 예 : 사람들이 다른 인코딩을 사용하면 소프트웨어가 매우 자주 중단되므로 솔직히 솔직하게 표현할 수 있습니다. 따라서 인코딩이 해당 세 가지 중 하나로보고되지 않는 한 좋은 방법은 공급자를 신뢰하는 것입니다. mb_check_encoding을 사용하여 그것이 실제로 유효하다는 것을 여전히 두 번 확인해야합니다 (유효 함은 존재하는 것과 같지 않습니다 - 동일한 입력이 많은 인코딩에 유효 할 수 있음에 유의하십시오). 그 중 하나 인 경우 mb_detect_encoding을 사용하여 이들을 구별 할 수 있습니다. 다행히 그것은 상당히 결정적입니다. UTF-8, ISO-8859-1, WINDOWS-1252의 적절한 감지 순서를 사용해야합니다.

    인코딩을 감지하면 내부 표현으로 변환해야합니다 (UTF-8 만이 정상적인 선택입니다). utf8_encode 함수는 ISO-8859-1을 UTF-8로 변환하므로 특정 입력 유형에만 사용할 수 있습니다. 다른 인코딩의 경우 mb_convert_encoding을 사용하십시오.

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

    4.이 치트 시트는 PHP에서 UTF-8 처리와 관련된 몇 가지 공통적 인주의 사항을 나열합니다. http://developer.loftdigital.com/blog/php-utf-8-cheatsheet

    이 치트 시트는 PHP에서 UTF-8 처리와 관련된 몇 가지 공통적 인주의 사항을 나열합니다. http://developer.loftdigital.com/blog/php-utf-8-cheatsheet

    문자열에서 멀티 바이트 문자를 감지하는이 함수는 도움이 될 수 있습니다 (소스).

    함수 detectUTF8 ($ 문자열) {     return preg_match ( '% (?:         [\ xC2- \ xDF] [\ x80- \ xBF] 2 바이트 비 중첩         | \ xE0 [\ xA0- \ xBF] [\ x80- \ xBF] # 초과를 제외한         | [\ xE1- \ xEC \ xEE \ xEF] [\ x80- \ xBF] {2} # 연속 3 바이트         | \ xED [\ x80- \ x9F] [\ x80- \ xBF] 대리모 제외         | \ xF0 [\ x90- \ xBF] [\ x80- \ xBF] {2} 비행기 1-3         | [\ xF1- \ xF3] [\ x80- \ xBF] {3} 평면 # 4-15         | \ xF4 [\ x80- \ x8F] [\ x80- \ xBF] {2} # 평면 16         ) + % xs ',     $ string); }

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

    5.isUTF8 함수를 구현하는 정말 좋은 방법은 php.net에서 찾을 수 있습니다 :

    isUTF8 함수를 구현하는 정말 좋은 방법은 php.net에서 찾을 수 있습니다 :

    function isUTF8($string) {
        return (utf8_encode(utf8_decode($string)) == $string);
    }
    
  6. ==============================

    6.조금 머리를 올리면 "ß"가 데이터베이스에 "Ÿ"로 표시되어야한다고하셨습니다.

    조금 머리를 올리면 "ß"가 데이터베이스에 "Ÿ"로 표시되어야한다고하셨습니다.

    아마도 latin1 문자 인코딩을 사용하는 데이터베이스를 사용하고 있거나 아마도 php-mysql 연결이 잘못 설정 되었기 때문일 수 있습니다. 즉, mysql이 utf-8을 사용하도록 설정 되었기 때문에 utf8로 데이터를 전송하지만 mysql belives PHP는 iso-8859-1로 인코딩 된 데이터를 보내므로, 다시 한번 여러분의 전송 된 데이터를 utf-8로 인코딩하려고 시도 할 수 있습니다.

    이것 좀 봐, 당신을 도울 수 있습니다 : http://php.net/manual/en/function.mysql-set-charset.php

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

    7.인코딩은 UTF-8로 인코딩 된 것처럼 보입니다. 즉, 다른 인코딩에서 UTF-8로, 다시 UTF-8로 인코딩됩니다. 마치 iso-8859-1이있는 것처럼 iso-8859-1에서 utf-8로 변환 된 다음 새 문자열을 iso-8859-1로 처리하여 UTF-8로 변환합니다.

    인코딩은 UTF-8로 인코딩 된 것처럼 보입니다. 즉, 다른 인코딩에서 UTF-8로, 다시 UTF-8로 인코딩됩니다. 마치 iso-8859-1이있는 것처럼 iso-8859-1에서 utf-8로 변환 된 다음 새 문자열을 iso-8859-1로 처리하여 UTF-8로 변환합니다.

    여기에 당신이 한 것에 대한 의사 코드가 있습니다 :

    $inputstring = getFromUser();
    $utf8string = iconv($current_encoding, 'utf-8', $inputstring);
    $flawedstring = iconv($current_encoding, 'utf-8', $utf8string);
    

    시도해야합니다 :

    그것은 "중간"변환에서 iso-8859-1을 사용했다고 가정합니다. windows-1252를 사용한 경우 windows-1252 (latin1)로 변환하십시오. 원본 소스 인코딩은 중요하지 않습니다. 당신이 결함있는, 두 번째 전환에 사용하는 하나입니다.

    이것은 내 추측입니다. 하나의 확장 된 ASCII 바이트 대신 4 바이트를 얻기 위해 수행 할 수있는 작업은 거의 없습니다.

    독일어는 iso-8859-2 및 windows-1250 (latin2)도 사용합니다.

  8. ==============================

    8.응답은 다른 인코딩으로 코딩 될 수 있으므로 입력시 문자 집합을 테스트해야합니다. 나는 다음과 같은 함수를 사용하여 탐지와 변환을 수행하여 모든 내용을 UTF-8로 보낸다.

    응답은 다른 인코딩으로 코딩 될 수 있으므로 입력시 문자 집합을 테스트해야합니다. 나는 다음과 같은 함수를 사용하여 탐지와 변환을 수행하여 모든 내용을 UTF-8로 보낸다.

    function fixRequestCharset()
    {
      $ref = array( &$_GET, &$_POST, &$_REQUEST );
      foreach ( $ref as &$var )
      {
        foreach ( $var as $key => $val )
        {
          $encoding = mb_detect_encoding( $var[ $key ], mb_detect_order(), true );
          if ( !$encoding ) continue;
          if ( strcasecmp( $encoding, 'UTF-8' ) != 0 )
          {
            $encoding = iconv( $encoding, 'UTF-8', $var[ $key ] );
            if ( $encoding === false ) continue;
            $var[ $key ] = $encoding;
          }
        }
      }
    }
    

    이 루틴은 원격 호스트에서 온 모든 PHP 변수를 UTF-8로 변환합니다. 또는 인코딩을 감지하거나 변환 할 수없는 경우 값을 무시하십시오. 필요에 맞게 사용자 지정할 수 있습니다. 변수를 사용하기 전에 호출하십시오.

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

    9.mb_detect_encoding 및 mb_convert_encoding의 흥미로운 점은 제안한 인코딩 순서가 중요하다는 것입니다.

    mb_detect_encoding 및 mb_convert_encoding의 흥미로운 점은 제안한 인코딩 순서가 중요하다는 것입니다.

    // $input is actually UTF-8
    
    mb_detect_encoding($input, "UTF-8", "ISO-8859-9, UTF-8");
    // ISO-8859-9 (WRONG!)
    
    mb_detect_encoding($input, "UTF-8", "UTF-8, ISO-8859-9");
    // UTF-8 (OK)
    

    따라서 예상 인코딩을 지정할 때 특정 순서를 사용하고자 할 수 있습니다. 그래도 이것이 절대 안전한 것은 아닙니다.

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

    10.간단합니다 : UTF8이 아닌 무언가를 얻었 으면, UTF8에 INPUT8을 인코딩해야합니다.

    간단합니다 : UTF8이 아닌 무언가를 얻었 으면, UTF8에 INPUT8을 인코딩해야합니다.

    따라서 ISO-8859-1의 특정 피드를 가져올 때 utf8_encode를 통해 구문 분석합니다.

    그러나 UTF8 피드를 가져 오는 경우 아무 것도 할 필요가 없습니다.

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

    11.RSS 피드의 문자 인코딩을 만드는 것은 복잡해 보입니다. 일반 웹 페이지조차도 종종 인코딩을 생략하거나 거짓말을합니다.

    RSS 피드의 문자 인코딩을 만드는 것은 복잡해 보입니다. 일반 웹 페이지조차도 종종 인코딩을 생략하거나 거짓말을합니다.

    따라서 올바른 방법으로 인코딩을 검색 한 다음 자동 감지 (추측)로 되돌릴 수 있습니다.

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

    12.나는이 질문이 오래되었다는 것을 알고 있지만 유용한 대답은 결코 아프지 않을 것이라고 생각한다. 데스크톱 응용 프로그램, SQLite 및 GET / POST 변수 간의 인코딩 문제가있었습니다. 일부는 UTF-8로, 일부는 ASCII로되어있을 것이고 기본적으로 외국 캐릭터가 개입되면 모든 것이 엉망이 될 것입니다.

    나는이 질문이 오래되었다는 것을 알고 있지만 유용한 대답은 결코 아프지 않을 것이라고 생각한다. 데스크톱 응용 프로그램, SQLite 및 GET / POST 변수 간의 인코딩 문제가있었습니다. 일부는 UTF-8로, 일부는 ASCII로되어있을 것이고 기본적으로 외국 캐릭터가 개입되면 모든 것이 엉망이 될 것입니다.

    여기 내 해결책이있다. 처리하기 전에 각 페이지로드시 GET / POST / REQUEST (쿠키를 생략했지만 원하는 경우 추가 할 수 있음)를 제거합니다. 헤더에서 잘 작동합니다. PHP가 소스 인코딩을 자동으로 감지 할 수 없으면 경고를 발생 시키므로 @는 경고를 표시하지 않습니다.

    //Convert everything in our vars to UTF-8 for playing nice with the database...
    //Use some auto detection here to help us not double-encode...
    //Suppress possible warnings with @'s for when encoding cannot be detected
    try
    {
        $process = array(&$_GET, &$_POST, &$_REQUEST);
        while (list($key, $val) = each($process)) {
            foreach ($val as $k => $v) {
                unset($process[$key][$k]);
                if (is_array($v)) {
                    $process[$key][@mb_convert_encoding($k,'UTF-8','auto')] = $v;
                    $process[] = &$process[$key][@mb_convert_encoding($k,'UTF-8','auto')];
                } else {
                    $process[$key][@mb_convert_encoding($k,'UTF-8','auto')] = @mb_convert_encoding($v,'UTF-8','auto');
                }
            }
        }
        unset($process);
    }
    catch(Exception $ex){}
    
  13. ==============================

    13.나는 시대로부터의 인코딩에 대한 해결책을 찾고 있었고 아마도이 페이지는 수년간의 검색의 결론 일 것입니다! 내가 언급 한 몇 가지 제안을 테스트했으며 여기에 내 메모가 있습니다.

    나는 시대로부터의 인코딩에 대한 해결책을 찾고 있었고 아마도이 페이지는 수년간의 검색의 결론 일 것입니다! 내가 언급 한 몇 가지 제안을 테스트했으며 여기에 내 메모가 있습니다.

    이것은 내 테스트 문자열입니다.

    이 문자열을 utf8_general_ci로 설정된 필드의 DB에 저장하려면 INSERT를 수행합니다.

    내 페이지의 문자 세트는 UTF-8입니다.

    INSERT를 그렇게하면, DB에서 화성에서 오는 문자가있을 것입니다 ... 그래서 나는 그들을 "정상적인"UTF-8로 변환 할 필요가있다. utf8_encode () 시도했지만 여전히 외계인 문자 내 데이터베이스를 침범했다 ...

    그래서 숫자 8에 게시 된 함수 forceUTF8을 사용하려고했지만 저장된 문자열은 다음과 같이 보입니다.

    그래서이 페이지에 더 많은 정보를 수집하고 다른 페이지에 다른 infos와 병합이 솔루션을 사용하여 내 문제를 해결 :

    $finallyIDidIt = mb_convert_encoding(
      $string,
      mysql_client_encoding($resourceID),
      mb_detect_encoding($string)
    );
    

    이제 내 데이터베이스에서 올바른 문자열로 내 문자열을 인코딩했습니다.

    노트: 주의 할 사항은 mysql_client_encoding 함수에있다! 이 함수는 리소스 ID를 매개 변수로 원하므로 DB에 연결해야합니다.

    하지만 글쎄, 난 그냥 내 INSERT 전에 다시 인코딩 그래서 나를 위해 문제가되지 않습니다.

    이것이이 페이지와 같은 누군가 나를 도왔 으면 좋겠다.

    모두에게 감사드립니다!

    마우로

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

    14.php.net/mb_detect_encoding

    php.net/mb_detect_encoding

    echo mb_detect_encoding($str, "auto");
    

    또는

    echo mb_detect_encoding($str, "UTF-8, ASCII, ISO-8859-1");
    

    정말 결과가 뭔지 모르겠지만 다른 인코딩으로 피드를 가져 와서 mb_detect_encoding이 작동하는지 확인하는 것이 좋습니다.

    최신 정보 auto는 "ASCII, JIS, UTF-8, EUC-JP, SJIS"의 약자입니다. 감지 된 문자셋을 반환합니다.이 문자셋을 사용하여 문자열을 iconv로 utf-8로 변환 할 수 있습니다.

    <?php
    function convertToUTF8($str) {
        $enc = mb_detect_encoding($str);
    
        if ($enc && $enc != 'UTF-8') {
            return iconv($enc, 'UTF-8', $str);
        } else {
            return $str;
        }
    }
    ?>
    

    나는 그것을 테스트하지 않았으므로 아무런 보증도하지 않습니다. 그리고 아마도 더 쉬운 방법이있을 것입니다.

  15. ==============================

    15.나를 위해 일한 @harpax. 내 경우에는 충분하다.

    나를 위해 일한 @harpax. 내 경우에는 충분하다.

    if (isUTF8($str)) { 
        echo $str; 
    }
    else
    {
        echo iconv("ISO-8859-1", "UTF-8//TRANSLIT", $str);
    }
    
  16. ==============================

    16.PHP 스크립트를 정렬 한 후, mysql에게 당신이 전달하고 받아 들이고 자하는 charset을 알려주는 것을 잊지 마십시오.

    PHP 스크립트를 정렬 한 후, mysql에게 당신이 전달하고 받아 들이고 자하는 charset을 알려주는 것을 잊지 마십시오.

    예 : 문자 집합 utf8 설정

    latin1 I / O 세션에서 latin1 테이블에 utf8 데이터를 전달하면 그 이상한 새벽이 생깁니다. 나는 oscommerce 상점에서 매일 이것을 본다. 뒤쪽과 네 번째로 옳은 것처럼 보일 수도 있습니다. 그러나 phpmyadmin은 진실을 보여줄 것입니다. mysql에게 당신이 전달하는 charset을 알려줌으로써 mysql 데이터의 변환을 처리 할 것이다.

    기존의 스크램블 된 mysql 데이터를 복구하는 방법은 논의 할 또 다른 주제이다. :)

  17. ==============================

    17.이 버전은 독일어 용이지만 $ CHARSETS 및 $ TEACHERS를 수정할 수 있습니다

    이 버전은 독일어 용이지만 $ CHARSETS 및 $ TEACHERS를 수정할 수 있습니다

    class CharsetDetector
    {
    private static $CHARSETS = array(
    "ISO_8859-1",
    "ISO_8859-15",
    "CP850"
    );
    private static $TESTCHARS = array(
    "€",
    "ä",
    "Ä",
    "ö",
    "Ö",
    "ü",
    "Ü",
    "ß"
    );
    public static function convert($string)
    {
        return self::__iconv($string, self::getCharset($string));
    }
    public static function getCharset($string)
    {
        $normalized = self::__normalize($string);
        if(!strlen($normalized))return "UTF-8";
        $best = "UTF-8";
        $charcountbest = 0;
        foreach (self::$CHARSETS as $charset) {
            $str = self::__iconv($normalized, $charset);
            $charcount = 0;
            $stop   = mb_strlen( $str, "UTF-8");
    
            for( $idx = 0; $idx < $stop; $idx++)
            {
                $char = mb_substr( $str, $idx, 1, "UTF-8");
                foreach (self::$TESTCHARS as $testchar) {
    
                    if($char == $testchar)
                    {
    
                        $charcount++;
                        break;
                    }
                }
            }
            if($charcount>$charcountbest)
            {
                $charcountbest=$charcount;
                $best=$charset;
            }
            //echo $text."<br />";
        }
        return $best;
    }
    private static function __normalize($str)
    {
    
    $len = strlen($str);
    $ret = "";
    for($i = 0; $i < $len; $i++){
        $c = ord($str[$i]);
        if ($c > 128) {
            if (($c > 247)) $ret .=$str[$i];
            elseif ($c > 239) $bytes = 4;
            elseif ($c > 223) $bytes = 3;
            elseif ($c > 191) $bytes = 2;
            else $ret .=$str[$i];
            if (($i + $bytes) > $len) $ret .=$str[$i];
            $ret2=$str[$i];
            while ($bytes > 1) {
                $i++;
                $b = ord($str[$i]);
                if ($b < 128 || $b > 191) {$ret .=$ret2; $ret2=""; $i+=$bytes-1;$bytes=1; break;}
                else $ret2.=$str[$i];
                $bytes--;
            }
        }
    }
    return $ret; 
    }
    private static function __iconv($string, $charset)
    {
        return iconv ( $charset, "UTF-8" , $string );
    }
    }
    

  18. ==============================

    18.헤더에서 인코딩을 가져 와서 utf-8로 변환하십시오.

    헤더에서 인코딩을 가져 와서 utf-8로 변환하십시오.

    $post_url='http://website.domain';
    
    /// Get headers ////////////////////////////////////////////////////////////
    function get_headers_curl($url) 
    { 
        $ch = curl_init(); 
    
        curl_setopt($ch, CURLOPT_URL,            $url); 
        curl_setopt($ch, CURLOPT_HEADER,         true); 
        curl_setopt($ch, CURLOPT_NOBODY,         true); 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
        curl_setopt($ch, CURLOPT_TIMEOUT,        15); 
    
        $r = curl_exec($ch); 
        return $r; 
    }
    $the_header = get_headers_curl($post_url);
    /// check for redirect /////////////////////////////////////////////////
    if (preg_match("/Location:/i", $the_header)) {
        $arr = explode('Location:', $the_header);
        $location = $arr[1];
    
        $location=explode(chr(10), $location);
        $location = $location[0];
    
    $the_header = get_headers_curl(trim($location));
    }
    /// Get charset /////////////////////////////////////////////////////////////////////
    if (preg_match("/charset=/i", $the_header)) {
        $arr = explode('charset=', $the_header);
        $charset = $arr[1];
    
        $charset=explode(chr(10), $charset);
        $charset = $charset[0];
        }
    ///////////////////////////////////////////////////////////////////////////////
    // echo $charset;
    
    if($charset && $charset!='UTF-8') { $html = iconv($charset, "UTF-8", $html); }
    
  19. ==============================

    19.Â는 Mojibake ß입니다. 데이터베이스에 16 진수가있을 수 있습니다.

    Â는 Mojibake ß입니다. 데이터베이스에 16 진수가있을 수 있습니다.

    DF if the column is "latin1",
    C39F if the column is utf8 -- OR -- it is latin1, but "double-encoded"
    C383C5B8 if double-encoded into a utf8 column
    

    PHP에서는 인코딩 / 디코딩 함수를 사용하지 않아야합니다. 대신 데이터베이스와 데이터베이스에 대한 연결을 올바르게 설정해야합니다.

    MySQL이 관련되어 있다면, 다음을보십시오 : utf8 문자로 인한 문제; 내가 보는 것은 내가 무엇을 저장 한 것이 아니다.

  20. ==============================

    20.나는 해결책을 여기에서 찾아 낸다 http://deer.org.ua/2009/10/06/1/

    나는 해결책을 여기에서 찾아 낸다 http://deer.org.ua/2009/10/06/1/

    class Encoding
    {
        /**
         * http://deer.org.ua/2009/10/06/1/
         * @param $string
         * @return null
         */
        public static function detect_encoding($string)
        {
            static $list = ['utf-8', 'windows-1251'];
    
            foreach ($list as $item) {
                try {
                    $sample = iconv($item, $item, $string);
                } catch (\Exception $e) {
                    continue;
                }
                if (md5($sample) == md5($string)) {
                    return $item;
                }
            }
            return null;
        }
    }
    
    $content = file_get_contents($file['tmp_name']);
    $encoding = Encoding::detect_encoding($content);
    if ($encoding != 'utf-8') {
        $result = iconv($encoding, 'utf-8', $content);
    } else {
        $result = $content;
    }
    

    나는 @가 나쁜 결정이라고 생각하고, deer.org.ua의 솔루션에 약간의 변경을가한다.

  21. ==============================

    21.가장 많이 투표 한 답변은 효과가 없습니다. 여기 내 것이고 그것이 도움이되기를 바랍니다.

    가장 많이 투표 한 답변은 효과가 없습니다. 여기 내 것이고 그것이 도움이되기를 바랍니다.

    function toUTF8($raw) {
        try{
            return mb_convert_encoding($raw, "UTF-8", "auto"); 
        }catch(\Exception $e){
            return mb_convert_encoding($raw, "UTF-8", "GBK"); 
        }
    }
    
  22. ==============================

    22.일본어와 한국어와 같은 다중 언어를 처리하려고하면 문제가 발생할 수 있습니다. 'auto'매개 변수가있는 mb_convert_encoding이 제대로 작동하지 않습니다. mb_detect_order ( 'ASCII, UTF-8, JIS, EUC-JP, SJIS, EUC-KR, UHC')는 EUC- *를 잘못 감지하므로 도움이되지 않습니다.

    일본어와 한국어와 같은 다중 언어를 처리하려고하면 문제가 발생할 수 있습니다. 'auto'매개 변수가있는 mb_convert_encoding이 제대로 작동하지 않습니다. mb_detect_order ( 'ASCII, UTF-8, JIS, EUC-JP, SJIS, EUC-KR, UHC')는 EUC- *를 잘못 감지하므로 도움이되지 않습니다.

    필자는 입력 문자열이 HTML에서 오는 한, meta 요소에 'charset'을 사용해야한다고 결론을 내렸다. 잘못된 HTML을 지원하기 때문에 Simple HTML DOM Parser를 사용합니다.

    아래의 스 니펫은 웹 페이지에서 title 요소를 추출합니다. 전체 페이지를 변환하려면 일부 행을 제거해야 할 수 있습니다.

    <?php
    require_once 'simple_html_dom.php';
    
    echo convert_title_to_utf8(file_get_contents($argv[1])), PHP_EOL;
    
    function convert_title_to_utf8($contents)
    {
        $dom = str_get_html($contents);
        $title = $dom->find('title', 0);
        if (empty($title)) {
            return null;
        }
        $title = $title->plaintext;
        $metas = $dom->find('meta');
        $charset = 'auto';
        foreach ($metas as $meta) {
            if (!empty($meta->charset)) { // html5
                $charset = $meta->charset;
            } else if (preg_match('@charset=(.+)@', $meta->content, $match)) {
                $charset = $match[1];
            }
        }
        if (!in_array(strtolower($charset), array_map('strtolower', mb_list_encodings()))) {
            $charset = 'auto';
        }
        return mb_convert_encoding($title, 'UTF-8', $charset);
    }
    
  23. ==============================

    23.나는 phpQuery (UTF-8 대신 ISO-8859-1)와 동일한 문제를 겪었으며이 해킹은 나를 도왔다.

    나는 phpQuery (UTF-8 대신 ISO-8859-1)와 동일한 문제를 겪었으며이 해킹은 나를 도왔다.

    $html = '<?xml version="1.0" encoding="UTF-8" ?>' . $html;
    

    mb_internal_encoding ( 'UTF-8'), phpQuery :: newDocumentHTML ($ html, 'utf-8'), mbstring.internal_encoding 및 기타 조작이 적용되지 않았습니다.

  24. ==============================

    24.'자동'없이 시도하십시오.

    '자동'없이 시도하십시오.

    그건:

    mb_detect_encoding($text)
    

    대신에:

    mb_detect_encoding($text, 'auto')
    

    더 많은 정보는 다음에서 찾을 수 있습니다 : mb_detect_encoding

  25. from https://stackoverflow.com/questions/910793/detect-encoding-and-make-everything-utf-8 by cc-by-sa and MIT license