복붙노트

참고 : json_encode를 사용하여 "특수"유니 코드 문자가 이상하게 인코딩되는 이유는 무엇입니까?

PHP

참고 : json_encode를 사용하여 "특수"유니 코드 문자가 이상하게 인코딩되는 이유는 무엇입니까?

"특수"유니 코드 문자를 사용하면 JSON으로 인코딩 할 때 이상한 쓰레기로 나옵니다.

php > echo json_encode(['foo' => '馬']);
{"foo":"\u99ac"}

왜? 내 인코딩에 문제가 있습니까?

(이것은 반복해서 나오기 때문에 주제를 명확히하기위한 참조 질문입니다.)

해결법

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

    1.무엇보다 먼저 여기에 아무 문제가 없습니다. 이것은 JSON에서 문자를 인코딩하는 방법입니다. 공식 표준입니다. 이것은 자바 스크립트 ECMAScript (7.8.4 절 "문자열 리터럴")에서 문자열 리터럴을 형성하는 방법을 기반으로하며 다음과 같이 설명됩니다.

    무엇보다 먼저 여기에 아무 문제가 없습니다. 이것은 JSON에서 문자를 인코딩하는 방법입니다. 공식 표준입니다. 이것은 자바 스크립트 ECMAScript (7.8.4 절 "문자열 리터럴")에서 문자열 리터럴을 형성하는 방법을 기반으로하며 다음과 같이 설명됩니다.

    즉, 모든 문자는 \ u ....로 인코딩 될 수 있습니다. 여기서 ....는 문자의 유니 코드 코드 포인트 (또는 BMP 외부의 문자에 대한 UTF-16 대리 쌍의 절반의 코드 포인트)입니다. .

    "馬"
    "\u99ac"
    

    이 두 문자열 리터럴은 똑같은 문자를 나타내며 절대적으로 같습니다. 이러한 문자열 리터럴이 호환 JSON 파서에 의해 구문 분석되면 문자열 "馬"이됩니다. 그들은 똑같지는 않지만 JSON 데이터 인코딩 형식에서 동일한 것을 의미합니다.

    PHP의 json_encode는 \ u .... 이스케이프 시퀀스를 사용하여 비 ASCII 문자를 인코딩하는 것이 좋습니다. 기술적으로는 그렇게 할 필요는 없지만 그렇습니다. 결과는 완벽하게 유효합니다. 이스케이프 시퀀스 대신 JSON에서 리터럴 문자를 사용하려는 경우 PHP 5.4 이상에서 JSON_UNESCAPED_UNICODE 플래그를 설정할 수 있습니다.

    php > echo json_encode(['foo' => '馬'], JSON_UNESCAPED_UNICODE);
    {"foo":"馬"}
    

    강조하기 위해 : 이것은 단지 기본 설정 일 뿐이므로 어떤 방식 으로든 JSON에서 "유니 코드 문자"를 전송할 필요는 없습니다.

  2. from https://stackoverflow.com/questions/22745662/reference-why-are-my-special-unicode-characters-encoded-weird-using-json-enco by cc-by-sa and MIT license