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


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

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",
        "메뉴": "오늘은 급식이 없습니다."
    }
]

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


조회수 64


20180214banner blockchain

1 답변


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

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

  • 2018년 02월 09일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close