유니코드 문자로 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_encode
ISO 8859-1에서 UTF-8로 변환됩니다.- 사용 시 "혼합" 출력이 발생했다고 말씀하셨습니다.
print_r
하고 나서utf8_encode
단, UTF-8 텍스트를 ISO 8859-1로 해석하려고 하면 발생하는 출력은 정확히 일치합니다( is는\x63\xb3
UTF-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);
언급URL : https://stackoverflow.com/questions/7381900/php-decoding-and-encoding-json-with-unicode-characters
'programing' 카테고리의 다른 글
Java에서의 JSON 문자열 해석 (0) | 2023.03.11 |
---|---|
AngularJS 시드: JavaScript를 별도의 파일(app.js, controllers.js, directives.js, filters.js, services.js)에 저장합니다. (0) | 2023.03.11 |
Wordpress에서 현재 페이지 번호 찾기 (0) | 2023.03.11 |
Javascript/HTML5에서 Excel(XLS) 파일을 해석하는 방법 (0) | 2023.03.11 |
머티리얼 UI 리액트 버튼이 리액트 라우터 돔 링크 역할을 하도록 하는 방법 (0) | 2023.03.11 |