PHP에서 출력되는 JSON 인코딩 문제
조회수 1348회
현재 카카오톡 급식 챗봇 개발을 하고 있는 고등학생입니다.
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",
"메뉴": "ì˜¤ëŠ˜ì€ ê¸‰ì‹ì´ 없습니다."
}
]
혹시 해결방법을 구할 수 있을까요?
-
(•́ ✖ •̀)
알 수 없는 사용자
댓글 입력