มือใหม่ ขอความช่วยเหลือสอบถามปัญหา json ไม่ยอมแสดงภาษาไทยครับ
คือพอผมลองเรียกใช้ดูมันขึ้นข้อความแบบนี้อะครับ u0e23\u0e49\u0e32\u0e19\u0e2d\u0e23\u0e48\u0e2d\u0e22
เลยอยากจะขอคำแนะนำหย่อยครับว่าควรจะแก้ไขยังไงดี
ขอบคุณครับ
Code (PHP)
<?php
header("Content-type:application/json; charset=UTF-8");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
$objConnect = mysql_connect("localhost","root","123") or die("Error connect");
$objDB = mysql_select_db("data_db");
mysql_query("set character set utf8");
$strSQL = "SELECT * FROM restaurant";
$objQuery = mysql_query($strSQL) or die ("Error Query[".$strSQL."]");
while($objResult = mysql_fetch_array($objQuery))
{
$data[]=array(
'Id_restaurant'=> $objResult['Id_restaurant'],
'Restaurant_name'=> $objResult['Restaurant_name'],
'Address'=> $objResult['Address'],
'Tel' => $objResult['Tel'],
'Website' => $objResult['Website'],
'Shoptype' => $objQuery['Shoptype'],
'Location' => $objResult['Location'],
'F_name' => $objResult['F_name'],
'Picture'=> $objResult['Picture'],
'Latitude'=> $objResult['Latitude'],
'Longtitude'=> $objResult['Longtitude']
);
}
echo json_encode($data);
?>
Tag : PHP, CakePHP, WebService, iOS, iPhone
Date :
2016-04-28 22:37:40
By :
moonumber_8
View :
6115
Reply :
20
https://www.thaicreate.com/php/forum/069253.html
Date :
2016-04-28 23:46:41
By :
ALTELMA
ลองใช้ อันนี้ ดูครับ mysql_query ("SET CHARACTER SET 'utf8'");
Date :
2016-04-29 06:51:14
By :
thriteen
Code (PHP)
<?php
$con = mysql_connect ($db["host"], $db["user"], $db["pass"]) or die (mysql_error());
mysql_select_db($db["dbname"]) or die(mysql_error());
mysql_query("SET NAMES UTF8");//แก้ไขแบบนี้
Date :
2016-04-29 08:55:14
By :
geidtiphong
ไม่น่าเกิดจากตัวส่ง เพราะมันส่งเป็น utf-8 มาแล้ว
น่าจะแก้ที่ตัวรับมากกว่าว่า decode มาไง
Date :
2016-04-29 15:01:33
By :
ห้ามตอบเกินวันละ 2 กระทู้
ข้อมูลก่อน Decode ปกติ มั้ยครับ?
Date :
2016-04-29 17:57:01
By :
ALTELMA
json_encode จะ encrypt unicode ในรูปแบบที่สามารถส่งผ่าน url ได้
ต้องถามวัตถุประสงค์ ที่ต้องการเปลี่ยนเป็นภาษาไทยครับว่า จะเปลี่ยนไปทำไม
ตอนที่เรานำไปแสดงผล มันไม่มีปัญหาเพราะจะต้อง decode ออกมาเป็น array ก่อนเพื่อใช้งาน
ตอนนี้จะเป็น utf8 เหมือนก่อน encode ถ้าแค่นี้ ก็ไม่ต้องไปเปลี่ยนเป็นภาษาไทยหรอกครับ
ยกเว้นว่าต้องการเอา array ทั้งหมด อัดลง database ค่อยแปลงด้วยฟังก์ชั่นข้างล่างครับ
Code (PHP)
function mat ($matches) {
return mb_convert_encoding(pack('H*',$matches[1]),'UTF-8','UTF-16');
}
function raw_json_encode($input) {
return preg_replace_callback( '/\\\\u([0-9a-zA-Z]{4})/', mat , json_encode($input) );
}
Date :
2016-04-29 20:00:26
By :
Chaidhanan
คือถ้า print string จาก การ encode ก็จะเป็นตามนั้นครับ
เพราะ json มองว่าคุณจะส่งข้อมูลผ่าน protocoll http ซึ่ง ไม่อาจส่งอักขระบางตัวได้
เลยทำการ encrypt ให้อยู่ในรูปแบบ url encode เพื่อส่ง ข้อมูลผ่าน http
และ ถึงแปลงกลับมาอีกที ด้วย json_decode() ก็จะได้ข้อมูลของเดิม จะทำอะไรต่อก็ว่ากันไป ครับ
พูดง่ายๆที่เราเห็นต่างดาว เพราะเราไปดู ที่มัน encrypt น่ะครับ มันไม่ได้ต้องการให้เราดูจากตรงนั้น
เหมือนกับเราไปดู base64_encode ซึ่งอ่านไม่รู้เรื่อง อันนันง่ายหน่อย เพราะมันไม่รู้เรื่องเลย เลยเข้าใจ
แต่ json encode มันดันอ่านรู้เรื่องในส่วนของภาษาอังกฤษ ภาษาไทยอ่านไม่รู้เรื่อง
(ไม่ใช่แค่ภาษาไทย จีน อิตาลี ญี่ปุ่น รัสเซีย ก็อ่านไม่รู้เรื่องเหมือนกัน โดน encrypt หมด)
Date :
2016-04-29 21:58:22
By :
Chaidhanan
เอาตัวอย่างที่ไม่ยอมแสดงไทยมาลงได้มั้ยครับ
Date :
2016-04-30 07:05:24
By :
mr.v
Code (PHP)
<?php
header("Content-type:application/json; charset=UTF-8");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
$objConnect = mysql_connect("localhost","root","123") or die("Error connect");
$objDB = mysql_select_db("data_db");
mysql_query("set character set utf8");
$strSQL = "SELECT * FROM restaurant";
$objQuery = mysql_query($strSQL) or die ("Error Query[".$strSQL."]");
while($objResult = mysql_fetch_array($objQuery))
{
$data[]=array(
'Id_restaurant'=> $objResult['Id_restaurant'],
'Restaurant_name'=> $objResult['Restaurant_name'],
'Address'=> $objResult['Address'],
'Tel' => $objResult['Tel'],
'Website' => $objResult['Website'],
'Shoptype' => $objQuery['Shoptype'],
'Location' => $objResult['Location'],
'F_name' => $objResult['F_name'],
'Picture'=> $objResult['Picture'],
'Latitude'=> $objResult['Latitude'],
'Longtitude'=> $objResult['Longtitude']
);
}
function mat ($matches) {
return mb_convert_encoding(pack('H*',$matches[1]),'UTF-8','UTF-16');
}
function raw_json_encode($input) {
return preg_replace_callback( '/\\\\u([0-9a-zA-Z]{4})/', mat , json_encode($input) );
}
echo raw_json_encode($data);
?>
จากตัวอย่างข้างบน คาดว่าข้อมูลน่าจะไปถึง ฝั่ง application แต่ไม่แน่ใจว่าจะไปได้ทุกตัวอักษรหรือไม่
ทางทีดีให้เปลี่ยนการส่ง จาก application/json เป็น text/html
และให้ ฝั่ง appliction ควรทำตัวรับ เป็น text ไม่ต้องรับเป็น json
แล้วค่อยใช้ คำสั่ง decode เอาจากการส่งแบบเดิม ดีกว่าครับ
ข้อมูลที่ได้ ก็จะเป็น array เหมือนต้นฉบับ เลือกใช้ element ตามใจชอบ
และ application ใช้โปรแกรมอะไรเขียนครับ
Date :
2016-04-30 07:57:37
By :
Chaidhanan
555 ผม ก็ติดปัญหาเดียวกับ จขกท
ใครไม่เคย เขียน app ที่เป็น ประเภท native จะไม่รู้ปัญหา แน่นอน
เพราะถ้าเขียน ผ่านบน web browser มันสามารถแก้ได้
ตอนนี้ ผมก็ยังแก้ไขไม่ได้ เลย
สั่งเกตุได้ คือ
ถ้าผม ส่ง json ผ่าน โปรแกรมที่ผมเขียน ขึ้น เป็นแบบ native ปัญหาคือ
อักขระ 0..9 และ a..z มันส่งไปที่ api server ได้ มันไม่เข้า รหัส
แต่ถ้า เป็นตัวอื่นนอกจากนี้ เข้า รหัสหมด
เช่น ตัว {"patien_id": "5555", "patien_title": "Mr", "patien_firstname": "สมศักดิ์"}
ตัว { เวลาไปถึงที่ server จะได้เป็นตัว %02
ตัว " เวลาไปถึงที่ server จะได้เป็นตัว %44
แต่พอ ตัว patien_id จะ ส่งไป ถูกต้อง ดังนี้ patien%34id ตัว _ มันก็เข้ารหัส
ยังหาวิธีแก้ไม่ได้ แต่รู้ปํญหา
ใช้ delphi เขียน api
ตอนนี้ เวลา test API ก็ใช้ postman ส่งไป ข้อมูลถูกต้องหมด
ขอบอกว่า จขกท หัวอกเดียวกัน เด๋อ (คนเขียน app แบบ native)
Date :
2020-04-10 03:38:23
By :
,มารวย
ผมใช้ TIdHttp + Json (TJSonObject.toJson) ส่งก็ไม่มีปัญหาอะไรนี่ครับ
เข้ารหัสมา พอไปถีง server ก็ถอดออก มีปัญหายังไงเหรอครับ
Date :
2020-04-10 08:28:18
By :
Chaidhanan
echo json_encode( $data, JSON_UNESCAPED_UNICODE );
Date :
2020-04-10 10:07:23
By :
max
Load balance : Server 03