개발 Q&A

제목 초보 개발자 문자열 인코딩에 대해 질문드립니다 ㅠ
카테고리 PHP
글쓴이 beans 작성시각 2017/12/06 17:27:31
댓글 : 12 추천 : 0 스크랩 : 0 조회수 : 11527   RSS

안녕하세요 선배님들 

이제 일한지 9개월차되는 초보 개발자..라고 하기도 뭐하네요..

이런저런 사정으로 혼자서 서비스를 담당하는 중인데 인코딩부분에서 막히게되었습니다ㅠ

 

제가 만들고있는 부분은

인스타그램에서 제공하는 API로 특정피드에 등록된 댓글을 가져와서

엑셀로 다운받을수있도록 하는 기능을 구현중인데

phpExcel 라이브러리를 확장해서 사용되는것으로 보이는 라이브러리의 함수를 사용해서 다운받는데까지는 성공했습니다.

그런데.. 가장중요한 댓글의 내용이 제대로 저장되지 않고 깨져서 출력이 되더라구요..

 

인스타에서 가져오는 데이터는 객체형식으로 반환되서

$data->text 으로 접근해서 댓글내용을 가져오는데 이걸그대로 엑셀에 입력되도록 값을 넣으면 아무것도 없더라구요.

그래서 json_encode($data->text)로 바꿔서 저장해보니

"\ub8f0\ub294\uacf3\uc640\u315c"
 

이런식으로 출력되더라구요.

인코딩형식의 문제인거같아서 iconv함수를 사용해서 요리조리 적용해봣는데 false로만 출력되서.. 멘붕이 왔습니다.

어떻게 해야될지 찾아봤는데 인코딩부분에 지식이 전무해서 모르겠습니다..ㅠ 

시간여유가 되면 천천히 검색하면서 공부하면서 문제를 찾을텐데..

혼자개발하는데다 일정이 빡빡해서 이렇게 답답한 마음에 질문드려봅니다 ㅠ

 다음글 에디터, 파일 업로드 라이브러리 종류에 대하여 (1)
 이전글 Production 배포 (3)

댓글

변종원(웅파) / 2017/12/06 17:39:33 / 추천 1

$data->text 는 utf-8일 것이구요. 엑셀은 euc_kr로 변환해야 제대로 나올겁니다.

json_encode($data->text) 했을때 "\ub8f0\ub294\uacf3\uc640\u315c" 라고 나오는 것은 정상입니다. json_decode 해보면 한글 제대로 나옵니다.

한대승(불의회상) / 2017/12/07 08:42:59 / 추천 1
iconv 함수를 어떻게 사용 하셨나요?
beans / 2017/12/07 09:26:51 / 추천 0

웅파님, 불의회상님 //  답변감사합니다ㅠㅜ

json_ecode대신 json_decode를 사용하라는 말씀이신가요? 

decode를 사용하면 아무것도 출력이 되지않더라구요

iconv는 

iconv("UTF-8", "EUC-KR", $d->text)

iconv("EUC-KR", "UTF-8", $d->text) 둘다 써봣는데 False로 뜨더라구요 ..

혹시나 싶어서 text를 json_encode, decode 둘다써서 넣어봣지만 결과는 같네요ㅠ

아니면 엑셀 형식이나 버전의 문제일까요..? 흑..

변종원(웅파) / 2017/12/07 11:25:46 / 추천 0
우선 $d->text 가 제대로 나오는지 화면에 출력해보세요. $d->text가 utf8이라는 가정에서 시작을 하는데 그렇지 않다면 다르게 시작이 됩니다. codigniter파일의 캐릭터셋이 utf-8인지도 체크해보시구요
beans / 2017/12/07 11:38:20 / 추천 0

넵 기본설정 utf-8로 되있습니다

 config파일엔 $config['charset'] = 'UTF-8'로 설정되있고

echo $d->text 로 출력해보면 안깨지고 잘나오고 있어요! 

엑셀 라이브러리 파일 설정은

header('Content-Type: application/vnd.ms-excel;charset=euc-kr');
header('Content-Disposition: attachment;filename="' . $filename . '.xls"');
header('Cache-Control: max-age=0'); 으로 되있습니다.
헤더부분에 euc-kr 을 utf-8로 변경해보았는데도 변화가 없네요ㅠ
한대승(불의회상) / 2017/12/07 12:25:17 / 추천 0
아래 코드로 테스트 해보세요.
iconv("utf-8", "euc-kr//IGNORE", $d->text)

 

beans / 2017/12/07 14:33:58 / 추천 0
			if(count($CommentList->data) > 0){
				$row = 1;
				foreach($CommentList->data as $d){
					$excelData['data'][] = array(
						$row, 
						($d->id), 
						$d->from->id, 
						$d->from->username,
						iconv("utf-8", "euc-kr//IGNORE", $d->text),
						mb_convert_encoding($d->text, "EUC-KR", "UTF-8"),
						date('Y-m-d H:i:s', $d->created_time)
					);
					$row++;
				}
			}else{
				$excelData['data'][] = array('등록된 댓글이 없습니다.');
			}
			 $this->excel->download($excelData);

이렇게 해봣는데 false false 로뜨네요 $excelData에 직접적으로 한글을 적어넣으면 잘나오는데 $d->text만 문제가 있습니다 ㅠ

beans / 2017/12/07 14:39:16 / 추천 0
charset확인하는 함수로 $d->text를 확인해보아도 UTF-8형식인걸 확인했는데 왜이런지 도통 모르겠습니다..
한대승(불의회상) / 2017/12/07 15:29:48 / 추천 0
iconv("utf-8", "euc-kr//IGNORE", $d->text) 대신 $d->text 했을때는 어떤결과가 나오나요?
beans / 2017/12/07 15:38:22 / 추천 0
$d->text 일경우에는 아예 값이 없는상태로 노출되고 있습니다 ㅠ iconv를 사용했을땐 전부 false로 출력되는 상태입니다..''
한대승(불의회상) / 2017/12/07 16:14:31 / 추천 0

현재 제공해주신 소스와 댓글만으로는 정확한 원인 파악이 힘드네요.

iconv 사용법도 정확하게 사용하고 계시구요.

beans / 2017/12/07 16:34:16 / 추천 0
흐으.. 답변감사합니다 ㅠ 삽질해보고 해결되면 어떻게 했는지 올려야겠네요 !