2011-05-04 2 views
2

문제가 있습니다.PHP : 들어오는 문자열을 인코딩하지 않고 UTF-8로 변환하십시오.

json_encode를 사용하여 데이터를 JSON으로 출력하는 REST API가 있습니다. 그러나 데이터가 UTF-8 데이터가 아닌 API로 푸시되는 경우가 있습니다. 그래서이 데이터를 출력하려 할 때 json_encode는 UTF-8 데이터 만 처리 할 수 ​​있기 때문에 예외를 throw합니다.

어떻게해야합니까? 어떻게 든 모든 들어오는 데이터를 UTF8로 강제로 변환 할 수 있습니까? 데이터 인코딩이 전송되는 정보가 없기 때문에 이것은 어려울 것 같습니다.

들어오는 데이터에 json_encode를 실행하고 인코딩 할 수없는 경우 오류를 반환해야합니까?

편집 : 나는 이것이 REST API라는 것을 잊어 버렸다. 그래서 많은 필드와 값을 가진 API에 POST 요청을받습니다.

+0

데이터의 출처는 어디입니까? – Emyr

+0

들어오는 데이터는 항상 UTF-8 또는 ISO-8859-1입니까, 아니면 다른 인코딩이 혼합되어 있습니까? 이게 얼마나 국제적인거야? –

+0

모두 다릅니다. 일부는 Twitter StreamingApi 클라이언트에서 가져온 것이고 일부는 전자 메일에서 가져온 것입니다. –

답변

1

그런 다음, 수신 데이터의 인코딩을 감지 할 mb_detect_encoding를 사용할 수 있습니다 iconv을 사용하여 데이터를 utf-8로 번역하십시오.

+1

+1 예, 제가 놓친 중요한 부분이었습니다. –

+0

내 API로 보내지는 POST 요청의 모든 필드에서이를 실행해야합니까? –

+0

예, UTF-8로 변환해야하는 모든 데이터입니다. 한 요청에 게시 된 모든 데이터가 동일한 인코딩 (즉, 동일한 요청에서 ISO-8859-1과 중국어 문자가 혼합되지 않을 것으로 예상 됨)이 될 것이라는 확신이 들면 한 필드에서 인코딩을 감지하고 그것을 사용하여 모두 변환하십시오. 당신을 위해 그것을 할 매우 기본적인 기능을 작성해야 쉽습니다. –

0

나는 mb_string 함수를 선호합니다. 여기에 php.net에서 샘플입니다

/* Convert internal character encoding to SJIS */ 
$str = mb_convert_encoding($str, "SJIS"); 

/* Convert EUC-JP to UTF-7 */ 
$str = mb_convert_encoding($str, "UTF-7", "EUC-JP"); 

/* Auto detect encoding from JIS, eucjp-win, sjis-win, then convert str to UCS-2LE */ 
$str = mb_convert_encoding($str, "UCS-2LE", "JIS, eucjp-win, sjis-win"); 

/* "auto" is expanded to "ASCII,JIS,UTF-8,EUC-JP,SJIS" */ 
$str = mb_convert_encoding($str, "EUC-JP", "auto"); 
2

당신 당신이 얻고있는 인코딩 무엇을 문자로 추측) (mb_detect_encoding 사용할 수 있지만 문자 인코딩을 추측에 관련된 추론 미만 100입니다 수 % 신뢰할 수 있으므로 여전히 작동하지 않을 수 있으며, 더 나쁜 경우 유효한 문자열을 mangle 할 수 있습니다.

JSON 소스가 content-type 헤더를 보내는 경우에는 (의도 된) 문자 인코딩도 포함해야합니다.

Content-Type: application/json; charset=ISO-8859-4 

이 정보가 정확한 경우 트랜스 코딩을 수행하는 데 사용할 수 있습니다.

+0

보낸 사람으로부터 인코딩 정보를 가져 오는 데 +1을 사용하는 것이 가장 안전한 방법입니다. – breiti

관련 문제