1. 문제상황
> json파일을 업로드하여 데이터를 저장하는 툴을 개발중에 전달받은 샘플 파일이 파싱이 되지 않는 문제가 발생하였다.
$readJson = file_get_contents($_FILES['json_file']['tmp_name']);
2. 문제확인
> 파일은 정상적으로 업로드 되는것으로 보여 읽어드린 스트링을 로그로 남겨 보았다.
DEBUG - 2015-06-16 06:38:33 --> 癤?
{
"index":1,
"name":"a",
"gold":0,
"resource":"A"
},
{
"index":2,
"name":"b",
"gold":1000,
"resource":"B"
},
{
"index":3,
"name":"c",
"gold":2000,
"resource":"C"
}
]
* 앞의 첫글짜가 깨져있다.
> 샘플파일의 인코딩을 확인해 보니 UTF-8 + BOM 형태였다. 윈도우즈의 특정 에디터(메모장 등)로 저장시 자동으로 BOM(Byte Of Mark)을 집어 넣는다고 한다. BOM은 유니코드 인코딩 방식인 UTF-8, UTF-16, UTF-32의 문서 맨앞에 특정 바이트를 넣어 인코딩 방식을 명시 하는 것으로 {UTF-8 : “EF BB BF”}, {UTF-16(Big Endian) : “FE FF”}, {UTF-16(Little Endian) : “FF FE”}, {UTF-32(Big Endian) : “00 00 FE FF”}, {UTF-32(Little Endian) : “FF FE 00 00”} 이 문서 맨에 붙게 된다.
3. 문제해결
> 파일을 읽어들여 다음 코드로 BOM을 제거 한 후 파싱을 하도록 한다.
$readJson = file_get_contents($_FILES['json_file']['tmp_name']);
// BOM 필터링
if (substr($readJson, 0, 3) == "\xEF\xBB\xBF") {
$readJson = substr($readJson, 3);
}