programing

유니코드 문자로 json을 디코딩 및 인코딩하는 PHP

yellowcard 2023. 3. 11. 08:49
반응형

유니코드 문자로 json을 디코딩 및 인코딩하는 PHP

해독하고, 바꾸고, 부호화해야 할 json이 있어요. 문자를 망치지 않고요.

json 문자열에 유니코드 문자가 있으면 디코딩되지 않습니다.json.org에서는 문자열에 다음 항목이 포함될 수 있다고 하므로 이유를 알 수 없습니다.any-Unicode-character- except-"-or-\-or- control-character하지만 비단뱀에서도 작동하지 않습니다.

{"Tag":"Odómetro"}

utf8_encode를 사용하면 문자열을 json_decode로 디코딩할 수 있지만 문자는 다른 것으로 망가집니다.이것은 결과 배열의 print_r에서 얻은 결과입니다.두 글자.

[Tag] => Odómetro

어레이를 다시 인코딩하면 문자가 json 사양에 따라 올바른 ASCII로 이스케이프됩니다.

"Tag"=>"Od\u00f3metro"

이 문제를 피할 수 있는 방법이 있을까요?json_encode는 이러한 옵션을 제공하지 않습니다.utf8_encode도 동작하지 않는 것 같습니다.

편집 json_encode에는 unescape_unicode 옵션이 있습니다.하지만 예상대로 되지 않습니다.이런 젠장, php 5.4에서만 나와요.5.3밖에 없어서 regex를 좀 써야겠어요.

$json = json_encode($array, JSON_UNESCAPED_UNICODE);
Warning: json_encode() expects parameter 2 to be long, string ...

이 문제를 해결하기 위한 다음과 같은 방법을 찾았습니다.이게 도움이 되었으면 좋겠어요.

json_encode($data,JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);

당신이 말한 모든 것으로 미루어 볼 때, 그것은 원본인 것 같다.Odómetro사용하고 있는 문자열은 UTF-8이 아닌 ISO 8859-1로 인코딩되어 있습니다.

내가 그렇게 생각하는 이유는 다음과 같다.

  • json_encode입력 문자열을 실행한 후 해석 가능한 출력이 생성되었습니다.utf8_encodeISO 8859-1에서 UTF-8로 변환됩니다.
  • 사용 시 "혼합" 출력이 발생했다고 말씀하셨습니다.print_r하고 나서utf8_encode단, UTF-8 텍스트를 ISO 8859-1로 해석하려고 하면 발생하는 출력은 정확히 일치합니다( is는\x63\xb3UTF-8의 경우, 그 시퀀스는óISO 8859-1에 기재되어 있습니다.
  • 당신의.htmlentities해커어라운드 솔루션이 성공했습니다. htmlentities는, 올바르게 동작하기 위해서, 입력 문자열의 부호화를 인식할 필요가 있습니다.지정하지 않으면 ISO 8859-1로 간주됩니다.html_entity_decode는, 혼란스럽게 디폴트 UTF-8 로 설정되어 있기 때문에, 사용의 메서드는 ISO 8859-1 에서 UTF-8 로의 변환 효과가 있었습니다).
  • Python에서도 같은 문제가 발생했다고 하셨는데, PHP가 문제가 되지 않는 것 같습니다.

PHP가 사용하는 것은\uXXXX이스케이프입니다만, 지적하신 바와 같이, 이것은 유효한 JSON입니다.

따라서 UTF-8 스트링을 제공하도록 Postgres에 대한 연결을 설정해야 할 것 같습니다.PHP 설명서에 따르면 다음을 추가하여 이 작업을 수행할 수 있습니다.options='--client_encoding=UTF8'접속 스트링에 접속합니다.되어 있는 사용하시면 ).utf8_encode ISO 8859-1)의합니다.

답변에서 그 외의 문자 해야 합니다이 문제는 """를 수" "HTTP " "를 실행한 환경의 아티팩트일 수 있습니다.다 ) 。print_r★★★★★★★★★★★★★★★★★★」

JSON_UNESCAPED_UNICODE PHP 5.4에 추가되었기 때문에 PHP 버전을 업그레이드해야 이점을 누릴 수 있을 것 같습니다. 5.4는 아직 출시되지 않았습니다! : (

QA에는 5.4의 알파 릴리스 후보가 있지만, 개발 머신에서 플레이하고 싶은 경우는 있습니다.

JSON_UNESCAPED_의 해박한 방법PHP 5.3의 UNICODE.PHP json 지원에 매우 실망했습니다.이게 다른 사람에게 도움이 될지도 몰라.

$array = some_json();
// Encode all string children in the array to html entities.
array_walk_recursive($array, function(&$item, $key) {
    if(is_string($item)) {
        $item = htmlentities($item);
    }
});
$json = json_encode($array);

// Decode the html entities and end up with unicode again.
$json = html_entity_decode($rson);
$json = array('tag' => 'Odómetro'); // Original array
$json = json_encode($json); // {"Tag":"Od\u00f3metro"}
$json = json_decode($json); // Od\u00f3metro becomes  Odómetro
echo $json->{'tag'}; // Odómetro
echo utf8_decode($json->{'tag'}); // Odómetro

근접했습니다. utf8_decode를 사용하세요.

해 보다utf-8다음 중 하나:

header('content-type:text/html;charset=utf-8');

이거면 돼요.

$arr = array('tag' => 'Odómetro');
$encoded = json_encode($arr);
$decoded = json_decode($encoded);
echo $decoded->{'tag'};

사용법:

utf8_decode() and utf8_encode

특수문자를 포함한 배열을 인코딩하려면 ISO 8859-1에서 UTF8로(utf8_encode & utf8_decode가 적합하지 않은 경우 옵션일 수 있습니다)

ISO-8859-1의 모든 것을 UTF8로 변환해야 합니다.

$utf8 = utf8_encode('이 감사의 마음을 전합니다!'); //contains UTF8 & ISO 8859-1 characters;    
$iso88591 = mb_convert_encoding($utf8, 'ISO-8859-1', 'UTF-8');
$data = $iso88591;

인코딩은 다음 후에 작동합니다.

$encoded_data = json_encode($data);

UTF-8을 ISO 8859-1로 변환

언급URL : https://stackoverflow.com/questions/7381900/php-decoding-and-encoding-json-with-unicode-characters

반응형