Laravel 웹 개발 중 콘텐츠를 euc-kr 인코딩을 하여 출력해야 하는 경우가 가끔 생깁니다.
대부분 utf-8을 사용하여 개발하니 인코딩을 바꿀일은 거의 없습니다만 외부 솔루션이나 API가 euc-kr을 사용하는 경우 인코딩을 해야하는 경우가 생깁니다.
Laravel 에서 euc-kr 출력하기
$contents = view('ns::pages.euckr', ['data' => $data])->render();
$contents = iconv('utf-8', 'euc-kr', $contents);
$response = Response::make($contents, 200);
$response->header('Content-Type', 'text/html; charset=euc-kr');
return $response;
코드를 보면 의미를 파악할 수 있는 분들이 많을 것이므로 코드 먼저 살펴보겠습니다.
위 코드는 라라벨의 blade를 사용하여 생성한 utf-8 콘텐츠를 euc-kr 로 바꿔 출력하는 예제입니다.
iconv 로 문자 인코딩 변경
iconv ( string $in_charset , string $out_charset , string $str ) : string
iconv() 함수는 $str 을 $in_charset 에서 $out_charset 으로 변경하여 반환합니다.
$contents = iconv('utf-8', 'euc-kr', $contents);
위와같이 쓰여진 코드가 있다면 $contents 변수에 담긴 문자열을 utf-8에서 euc-kr로 변경하여 다시 $contents에 저장하라는 의미입니다.
Laravel 에서 blade를 사용하여 만든 텍스트가 utf-8 이기 때문에 이를 euc-kr로 변경하여 $contents 변수에 저장해둡니다.
헤더에 charset=euc-kr 지정
$response->header('Content-Type', 'text/html; charset=euc-kr');
HTTP 응답에서 header에 Content-Type에 위처럼 지정하면 브라우저가 이를 이해하고 인코딩을 결정할 수 있습니다.
출력하는 텍스트가 html이라면 이 html의 meta 태그에 charset을 지정하는 곳이 있습니다만 이를 바꾼다고 브라우저가 해당 인코딩으로 html을 읽지는 않습니다.
Response 출력
$response = Response::make($contents, 200);
$response->header('Content-Type', 'text/html; charset=euc-kr');
return $response;
$contents에 euc-kr로 인코딩된 텍스트를 저장하고 위와 같은 코드를 호출하여 출력할 수 있습니다.
Laravel에서 euc-kr로 인코딩 된 텍스트를 echo로 출력하면 브라우즈가 인코딩을 제대로 표현하지 못합니다.
Route::get('/test', function () {
$contents = iconv('utf-8', 'euc-kr', '하하하');
header("Content-type: text/html; charset=euc-kr");
echo $contents;
});
위 코드에서 echo 출력 후 exit; 를 실행하면 브라우저에서 한글이 잘 나옵니다.
Route::get('/test', function () {
$contents = iconv('utf-8', 'euc-kr', '하하하');
header("Content-type: text/html; charset=euc-kr");
echo $contents;
exit; // -- exit; 추가!!
});
exit; 를 추가해야 잘 나오는 것을 보니 Laravel이 출력시에 헤더 정보를 변경하는 것으로 보여집니다.
exit 호출로 Laravel이 헤더 정보를 변경하는 기회를 잃는 것으로 보여집니다.
따라서 이를 Laravel의 Response를 통해 출력하도록 만든 것이 위의 코드입니다.
Laravel euc-kr 출력 정리
- utf-8으로 만들어진 콘텐츠를 euc-kr로 컨버팅
- Content-Type 헤더를 수정할 수 있지만 Laravel이 이를 되돌리지 않게 설정 후 출력