json_encode() 하다가 'Invalid UTF-8 sequence in argument' 하는 식의 warning 이 날 때가 있다.
json_encode 함수는 무조건 UTF-8 만 가능한데 UTF-8 인코딩이 아닌 데이터를 json_encode 하려 할 때 발생하는 문제다.
json_encode() 시킬 데이터에 들어있는 문자열 중 UTF-8 인코딩이 아닌 데이터를 iconv()를 이용해 UTF-8로 변환한 후 json_encode() 를 해주면 문제를 해결할 수 있다.
// $s 는 euc-kr 인코딩 된 '가' 라는 문자열이라고 가정함
$arr = array($s);
// 그냥 json_encode()를 하면 warning이 뜨고 null이 들어감
var_dump(json_encode($arr)); // -> string(12) "{"str":null}"
// 아래처럼 하면 제대로 나옴
var_dump(Json::encode($arr)); // -> string(16) "{"str":"\uac00"}"
class Json
{
private static $detect_order = 'UTF-8,EUC-KR';
public static function encode($data, $detect_order=null)
{
if ($detect_order === null) $detect_order = self::$detect_order;
return json_encode(self::convertEncoding($data, $detect_order));
}
private static function convertEncoding($data, $detect_order)
{
if (is_array($data)) {
foreach ($data as $k=>$v) {
$data[$k] = self::convertEncoding($v, $detect_order);
}
}
else if (is_string($data)) {
$detected = mb_detect_encoding($data, $detect_order);
if ($detected != 'UTF-8') $data = iconv($detected, 'UTF-8', $data);
}
return $data;
}
}
'PHP' 카테고리의 다른 글
[PHP] 유니코드 문자열 한글판별 (unicode, hangul) (0) | 2013.10.30 |
---|---|
[PHP] 소스 레벨에서 표준 I/O 스트림 리다이렉트 (STDIN, STDOUT, STDERR redirect) (0) | 2013.08.19 |
[PHP] PHP에서 STDERR 로 출력하는 법. (0) | 2013.03.15 |
[PHP] 한글 도메인 퓨니코드 변환 (Punycode) (0) | 2013.01.10 |
[PHP] 숫자 0, 문자/문자열 비교시 주의 (zero, character, string, type cast, equals) (4) | 2012.12.06 |