2013-05-14 2 views
0

배경 : 내 시스템의 일부는 json_encode로 전달하기 전에 utf8_encode를 사용하여 HTML 코드를 utf8 형식으로 변환합니다.utf8 문자가 포함 된 PHP utf8_encode

문제점 : 시스템에 UTF8 문자 (중국어)를 입력 할 때까지 아무 문제가 없었습니다. 언급 한 UTF8 문자가 두 번 인코딩되어 깨져서 나왔습니다.

사이드 노트 : 지금까지 캐릭터 세트 인코딩 및 기타 등등의 경험이 없습니다. 아마도 데이터베이스와 연결이 이미 utf8로 설정되어 있기 때문에 json_encode 전에 utf8_encode를 사용할 필요가 없을 것입니다. html 코드에 중국어 문자가 없으면 mb_detect_encoding은 ASCII (ISO-8859-1이 아님)를 반환합니다. 하지만 null을 반환하지 않고 json_encode를 통과 할 수 없었습니다 ... 따라서 지금까지 작동 한 utf_8 인코딩을 사용합니다.

업데이트 : 마지막으로 html 코드를 문자열로 typecasting하여이 문제를 해결했습니다. via (string) $ html; json_encode()에 할당하기 전에.

최종 솔루션을 이끌어 낸 모든 사람들 덕분에.

+1

@ x4rf41 사용 된 데이터에 UTF-8 인코딩 문자가 포함 된 경우입니다. 그렇지 않으면 ISO-8859-1 인코딩 인 것 같습니다. 아마 당신은'mb_convert_encoding()'] (http://www.php.net/manual/en/function.mb-convert-encoding.php)와'mb_detect_encoding()'을 시도하고 싶을 것입니다. – Lukas

+0

'$ json = json_encode ($ data, JSON_UNESCAPED_UNICODE); 시도 했습니까? – HamZa

+1

죄송합니다, php5.3을 사용합니다. – ephemeron

답변

1

비슷한 문제가있었습니다. 아마도 이것은 도움이 될 것입니다 : iconv();을 사용해보십시오. 나는 utf8 - 내가 json_encode을 사용할 때 출력이 없었던 인코딩에서 폴란드 문자 (ęężćźłłń 등)에 몇 가지 문제가있었습니다. iconv();을 사용하면 모든 것이 잘되었습니다. catch는 진행하기 전에 소스 인코딩을 알아야합니다. 인코딩을 모르는 경우 @Lukas가 제안한대로 mb_detect_encoding()을 사용하십시오. 예 :

$content = iconv('ISO-8859-2','UTF-8', $content); 
echo json_encode(array('content' => $content)); 
+1

사실 나는 이전에 iconv() 및 mb_detect_encoding()을 시도했습니다. mb_detect_encoding()의 결과는 utf8 이었으므로 iconv를 더 이상 사용하지 않을 것입니다. 그러나 내 혁신은 iconv (mb_detect_encoding ($ html), 'UTF-8', $ html) 과 일치합니다. 이상하게도 iconv ('UTF-8', 'UTF-8', $ html)가 답이었습니다. .. – ephemeron

+0

* 인코딩을 알 수있는 대안은 없습니다. 인코딩을 "감지하는"것은 정의에 의해 신뢰할 수있게 가능하지 않으며, 신뢰할 수없는 첫 번째 유효한 선택 알고리즘 일뿐입니다. – deceze

+0

@ephemeron 즉, 텍스트가 이미 UTF-8로되어 있고 인코딩 변환을 전혀 필요로하지 않는다는 의미입니다. – deceze

관련 문제