programing

PHP json 인코딩 - 잘못된 형식의 UTF-8 문자, 잘못 인코딩되었을 수 있습니다.

goodsources 2023. 2. 14. 20:15
반응형

PHP json 인코딩 - 잘못된 형식의 UTF-8 문자, 잘못 인코딩되었을 수 있습니다.

사용하고 있다json_encode($data)러시아 문자를 포함하는 필드가 있습니다.

이거 썼어mb_detect_encoding()UTF-8 이라고 표시됩니다.

json encode는 "filters▒"와 같은 문자가 잘못되어 실패한 것 같습니다.나는 많은 것을 시도했다.utf8_encode이 에러는 통과하지만 데이터가 더 이상 정확해 보이지 않습니다.

이 문제를 해결하려면 어떻게 해야 합니까?

대부분의 문자가 utf8 문자이지만 utf8 문자 이외의 문자가 포함되어 있으면 문제가 발생합니다.그러면 utf8 이외의 문자가 모두 삭제되고 이제 작동합니다.

$data['name'] = mb_convert_encoding($data['name'], 'UTF-8', 'UTF-8');

JSON 형식으로 인코딩할 다차원 배열이 있는 경우 다음 함수를 사용할 수 있습니다.

JSON_ERROR_UTF8이 발생한 경우:

$encoded = json_encode( utf8ize( $responseForJS ) );

아래 함수는 어레이 데이터를 재귀적으로 인코딩하는 데 사용됩니다.

/* Use it for json_encode some corrupt UTF-8 chars
 * useful for = malformed utf-8 characters possibly incorrectly encoded by json_encode
 */
function utf8ize( $mixed ) {
    if (is_array($mixed)) {
        foreach ($mixed as $key => $value) {
            $mixed[$key] = utf8ize($value);
        }
    } elseif (is_string($mixed)) {
        return mb_convert_encoding($mixed, "UTF-8", "UTF-8");
    }
    return $mixed;
}

반드시 utf8로 charset iso를 사용하여 Pdo 개체를 시작하십시오.이렇게 하면 이 문제가 해결됩니다.재활용되는 춤은 피할 수 있습니다.

$pdo = new PDO("mysql:host=localhost;dbname=mybase;charset=utf8", 'user', 'password');

php 7.2에서는 두 가지 옵션을 사용하여 json_encode에서 비활성 UTF-8을 관리할 수 있습니다.

https://www.php.net/manual/en/function.json-encode

json_encode($text, JSON_INVALID_UTF8_IGNORE);

또는

json_encode($text, JSON_INVALID_UTF8_SUBSTITUTE);

pdo connection charset=utf8을 pdo connection의 아래 행과 같이 추가합니다.

$pdo = new PDO("mysql:host=localhost;dbname=mybase;charset=utf8", 'user', 'password');

이것이 너에게 도움이 되기를 바란다.

JSON 인코딩 전에 HTML 엔티티를 제거합니다.나는 사용했다html_entity_decode()문제가 해결되었습니다.

$json = html_entity_decode($source);
$data = json_decode($json,true);

결과 세트에 UUID가 있습니까?이 경우 다음 데이터베이스 플래그가 도움이 됩니다.

PDO::DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER => true

예를 들어 데이터가 데이터베이스에 올바르게 인코딩되어 있는 경우 문자열 처리에 mb_* 함수를 json_encode 전에 사용하십시오.기판이나 strlen과 같은 함수는 utf8mb4에서 잘 작동하지 않으며 텍스트를 잘라내고 잘못된 형식의 UTF8을 남길 수 있습니다.

이게 좀 오래된 주제인 건 알지만, 제게는 그게 필요했어요.나는 단지 'jayashan pererera'라는 답을 수정해야 했다.

//...code
        $stmt->execute();
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);


        for ($i=0; $i < sizeof($result) ; $i++) { 
            $tempCnpj = $result[$i]['CNPJ'];
            $tempFornecedor = json_encode(html_entity_decode($result[$i]['Nome_fornecedor']),true) ;
            $tempData = $result[$i]['efetivado_data'];
            $tempNota = $result[$i]['valor_nota'];
            $arrResposta[$i] = ["Status"=>"true", "Cnpj"=>"$tempCnpj", "Fornecedor"=>$tempFornecedor, "Data"=>"$tempData", "Nota"=>"$tempNota" ];
        }

        echo json_encode($arrResposta);

.js는 사용할 수 없습니다.

obj = JSON.parse(msg); 

언급URL : https://stackoverflow.com/questions/46305169/php-json-encode-malformed-utf-8-characters-possibly-incorrectly-encoded

반응형