developer tip

json_encode () : 인수에 잘못된 UTF-8 시퀀스가 ​​있습니다.

copycodes 2020. 12. 24. 23:52
반응형

json_encode () : 인수에 잘못된 UTF-8 시퀀스가 ​​있습니다.


json_encode()데이터 utf8_general_ci정렬 을 사용하여 MySQL 데이터베이스에서 가져온 데이터를 호출 하고 있습니다 . 문제는 일부 행에 정리할 수없는 이상한 데이터가 있다는 것입니다. 예를 들어 symbol 에 도달 json_encode()하면 json_encode(): Invalid UTF-8 sequence in argument.

나는 해봤 utf8_encode()utf8_decode()도 함께, mb_check_encoding()그것을 통해 얻고 혼란을 일으키는 유지하지만.

Mac에서 PHP 5.3.10 실행. 그래서 문제는-유효하지 않은 utf8 기호를 어떻게 정리하고 나머지 데이터를 유지하면 json_encoding()작동합니까?

최신 정보. 이를 재현하는 방법은 다음과 같습니다.

echo json_encode(pack("H*" ,'c32e'));

쿼리에서 잘못된 문자 집합이 반환되어 문자열에 곱슬 아포스트로피와 같은 hi-ascii 문자가있을 때마다 json_encode가 null 필드를 반환하는 유사한 오류가 발생했습니다.

해결책은 다음을 추가하여 utf8로 제공되도록하는 것입니다.

mysql_set_charset('utf8');

mysql connect 문 뒤에.


기호가 Å인 것처럼 보이지만 데이터가 공개되어서는 안되는 성으로 구성되어 있기 때문에 첫 글자 만 표시되고 단지 $lastname[0]의해 수행 되었으므로 멀티 바이트 문자열에는 잘못되어 전체적인 번거 로움이 발생했습니다. 변경 mb_substr($lastname, 0, 1)-매력처럼 작동합니다.


문제는이 문자가 UTF8이지만 json_encode가 올바르게 처리하지 않는다는 것입니다. 더 말하면 동일한 오류를 유발하는 다른 문자 목록 ( 유니 코드 문자 목록 참조)이 있으므로이 문자 (Å)를 제거해도 문제가 끝까지 해결되지는 않습니다.

우리가 사용한 것은 이러한 문자를 다음과 같은 html 엔티티로 변환하는 것입니다.

htmlentities( (string) $value, ENT_QUOTES, 'utf-8', FALSE);

MySQL에 대한 연결 문자 세트가 UTF-8인지 확인하십시오. 기본값은 종종 ISO-8859-1이며 MySQL 드라이버가 텍스트를 ISO-8859-1로 변환 함을 의미합니다.

mysql_set_charset , mysqli_set_charset 또는 쿼리를 사용하여 연결 문자 집합을 설정할 수 있습니다.SET NAMES 'utf-8'


이 코드를 사용하면 도움이 될 수 있습니다. 내 문제가 해결되었습니다!

mb_convert_encoding($post["post"],'UTF-8','UTF-8');

또는 그렇게

mb_convert_encoding($string,'UTF-8','UTF-8');

게시 한 기호는 끊어진 바이트 시퀀스에 대한 자리 표시 자 기호입니다. 기본적으로 실제 기호가 아니라 문자열의 오류입니다.

기호의 정확한 바이트 값은 무엇입니까? 맹목적으로 utf8_encode를 적용하는 것은 좋은 생각이 아닙니다. 먼저 바이트의 출처와 의미를 알아내는 것이 좋습니다.


php의 json_encode 함수를 사용할 때이 오류를 발생시키는 또 다른 이유는 유니 코드 문자가 소문자 \ u가 아니라 대문자 \ U 일 때입니다.


json_encode는 UTF-8 데이터에서만 작동합니다. 데이터가 UTF-8인지 확인해야합니다. 또는 iconv ()를 사용하여 결과를 json_encode ()에 공급하기 전에 UTF-8로 변환 할 수 있습니다.


업데이트 .. 다음과 같이 PDO 연결에 문자 집합을 지정하여이 문제를 해결했습니다.

"mysql : host = $ host; dbname = $ db; charset = utf8"

수신 된 모든 데이터는 나머지 코드에서 사용할 수 있도록 올바른 문자 세트에 있습니다.


I am very late but if some one working on SLIM to make rest api and getting same error can solve this problem by adding below line as:

<?php

// DbConnect.php file
class DbConnect
{
    //Variable to store database link
    private $con;

    //Class constructor
    function __construct()
    {

    }

    //This method will connect to the database
    function connect()
    {
        //Including the constants.php file to get the database constants
        include_once dirname(__FILE__) . '/Constants.php';

        //connecting to mysql database
        $this->con = new mysqli(DB_HOST, DB_USERNAME, DB_PASSWORD, DB_NAME);

        mysqli_set_charset($this->con, "utf8"); // add this line 
        //Checking if any error occured while connecting
        if (mysqli_connect_errno()) {
            echo "Failed to connect to MySQL: " . mysqli_connect_error();
        }

        //finally returning the connection link
        return $this->con;
    }
}

json_encode 전에 setLocale ( 'fr_FR.UTF8')을 사용하면 문제가 해결되었습니다.

참조 URL : https://stackoverflow.com/questions/10205722/json-encode-invalid-utf-8-sequence-in-argument

반응형