태그 글목록: json_decode error

[문제해결] UTF-8 + BOM 인코딩 2015-06-16

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”} 이 문서 맨에 붙게 된다.

UTF-8 BOM


3. 문제해결

> 파일을 읽어들여 다음 코드로 BOM을 제거 한 후 파싱을 하도록 한다.

$readJson = file_get_contents($_FILES['json_file']['tmp_name']);
				
// BOM 필터링
if (substr($readJson, 0, 3) == "\xEF\xBB\xBF") {
	$readJson = substr($readJson, 3);
}