PHP에서 출력되는 JSON 인코딩 문제

조회수 1349회

현재 카카오톡 급식 챗봇 개발을 하고 있는 고등학생입니다.

NEIS 에서 급식 표를 파싱하는 PHP 파일(test.php)을 통해 JSON 파일(meal.json)을 생성하고 이 파일을 다른 PHP 파일(message.php)에서 읽어서 최종적으로는 변수 형태로 출력하는 로직을 구현중에 있습니다. (매번 업데이트를 하기 위해 test.php파일은 60초 단위로 refresh 되며, 새로운 내용이 meal.json 파일에 쓰여집니다.)

모든 파일들을 Heroku(php7.1.13)에 올려 작업하고 있습니다.

현재 막히는 부분은 아래와 같은 test.php에서 만들어진 meal.json을 확인하면 한글이 깨져 나타납니다.

test.php

<?php
/**
* meal_api.php
* Created: Tuesday, Jan 30, 2018
* 
* Juneyoung KANG <juneyoung@juneyoung.me>
* Gyoha High School
*
* Creates a today school meal JSON file from the NEIS webpage.
* Github : https://github.com/Juneyoung-Kang/meal-api/
*
* How to use?
* http://juneyoung.me/api/school-meal/meal_api.php?countryCode=stu.goe.go.kr&schulCode=J100004922&insttNm=교하고등학교&schulCrseScCode=4&schMmealScCode=2/
* 
* For more information, visit github and see README.md
*
* Licensed under The MIT License
*/

header('Refresh: 60');                        // refresh every 60sec

error_reporting(0);                           // error reporting disable
header("Content-type: text/html; charset=UTF-8");        // json type and UTF-8 encoding

require "simple_html_dom.php";                // use 'simple_html_dom.php'

$countryCode = $_GET['countryCode'];          // local office of education website
$schulCode =  $_GET['schulCode'];             // school code
$insttNm = $_GET['insttNm'];                  // school name
$schulCrseScCode = $_GET['schulCrseScCode'];  // school levels code
$schMmealScCode = $_GET['schMmealScCode'];    // meal kinds code

// custom date
// $schYmd = $_GET['schYmd'];

$MENU_URL = "sts_sci_md01_001.do";            // view weekly table

$today=date("Y.m.d");                         // get date using date() function. ex) 2018.01.01
$day=date("w");                               // get day using date() function. ex) 0==Sunday, 1==Monday, 6==Saturday

// url for today
$URL="http://" . $countryCode . "/" . $MENU_URL . "?schulCode=" . $schulCode . "&insttNm=" . urlencode( $insttNm ) . "&schulCrseScCode=" . $schulCrseScCode . "&schMmealScCode=" . $schMmealScCode . "&schYmd=" . $today;

// DOMDocument
$dom=new DOMDocument;

// load HTML file 
$html=$dom->loadHTMLFile($URL);
$dom->preserveWhiteSpace=false;

// get elements by tag name
$table=$dom->getElementsByTagName('table');
$tbody=$table->item(0)->getElementsByTagName('tbody');
$rows=$tbody->item(0)->getElementsByTagName('tr');
$cols=$rows->item(1)->getElementsByTagName('td');

// check blank has values
if($cols->item($day)->nodeValue==null){
    echo '';
}else{
    $final=$cols->item($day)->nodeValue;
}

// replace unnecessary characters
$final=preg_replace("/[0-9]/", "", $final);
$final=str_replace(".", "", $final);

// change code number to text
if($schulCrseScCode==1){
    $schulCrseScCode="유치원";
}
if($schulCrseScCode==2){
    $schulCrseScCode="초등학교";
}
if($schulCrseScCode==3){
    $schulCrseScCode="중학교";
}
if($schulCrseScCode==4){
    $schulCrseScCode="고등학교";
}
if($schMmealScCode==1){
    $schMmealScCode="조식";
}
if($schMmealScCode==2){
    $schMmealScCode="중식";
}
if($schMmealScCode==3){
    $schMmealScCode="석식";
}

// no meal
if($final==null){
    $final="오늘은 급식이 없습니다.";
}

// array
$array[] = array(
    '교육청 코드' => $countryCode,
    '학교 코드' => $schulCode,
    '학교 명' => $insttNm,
    '학교 종류' => $schulCrseScCode,
    '급식 종류' => $schMmealScCode,
    '날짜' => $today,
    '메뉴' => $final
);

$fp = fopen('meal.json', 'w');
fwrite($fp, json_encode($array, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
fclose($fp);

?>

meal.json

[
    {
        "교육청 코드": "stu.goe.go.kr",
        "학교 코드": "J100004922",
        "학교 명": "êµí•˜ê³ ë“±í•™êµ",
        "학교 종류": "ê³ ë“±í•™êµ",
        "급식 종류": "중식",
        "ë‚ ì§œ": "2018.02.09",
        "메뉴": "오늘은 급식이 없습니다."
    }
]

혹시 해결방법을 구할 수 있을까요?

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • meal.json 파일을 쓰고 읽을 때 문자 인코딩을 맞춰주세요 .

    iconv 함수를 검색해서 활용하시면 답이 나올 것 같네요

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)