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;

    }

}










Posted by bloodguy
,