|
|
|
ปัญหาการแปลง Array object ให้เป็น json เพื่อส่งไปอีกหน้าเพื่อแสดงผล |
|
|
|
|
|
|
|
PHP version เก่าอะครับ มีปัญหากับ unicode
ให้ใช้ function ข้างล่างแทนครับ
Code (PHP)
function raw_json_encode($input) {
return preg_replace_callback( '/\\\\u([0-9a-zA-Z]{4})/',
create_function(
'$matches',
"return mb_convert_encoding(pack('H*',$matches[1]),'UTF-8','UTF-16');"
),
json_encode($input) );
}
|
|
|
|
|
Date :
2014-12-05 16:02:01 |
By :
Chaidhanan |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ขอโทษครับประมาทไปหน่อย
11. "return mb_convert_encoding(pack('H*',$matches[1]),'UTF-8','UTF-16');"
แก้เป็น
11. 'return mb_convert_encoding(pack("H*",$matches[1]),"UTF-8","UTF-16");'
เหตุผล สีแดงเป็นตัวแปร อยู่ใน double quote มันถูกแปลงก่อน ทำงานครับ
|
|
|
|
|
Date :
2014-12-05 16:31:23 |
By :
Chaidhanan |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ตอบความคิดเห็นที่ : 6 เขียนโดย : Chaidhanan เมื่อวันที่ 2014-12-05 16:46:55
รายละเอียดของการตอบ ::
ครับ และก็ไม่ควรใช้ create_function() ด้วยครับ
เพราะมันทำให้ MEMORY LEAK ถ้าใช้ผิดวิธี ลองรันดูครับ แล้วจะตกใจ
<?php
function raw_json_encode($input) {
return preg_replace_callback(
'/\\\\u([0-9a-zA-Z]{4})/',
create_function(
'$matches',
'return mb_convert_encoding(pack("H*",$matches[1]),"UTF-8","UTF-16");'
),
json_encode($input)
);
}
echo 'Before: ', memory_get_usage(). '<br>';
for ($i = 0; $i < 10000; ++$i) {
raw_json_encode('Hello');
}
echo 'After: ', memory_get_usage();
เพราะ create_function() มันจะสร้างฟังก์ชั่นใหม่ไว้ใน global scope ทุกครั้งที่เรียกใช้ แม้จะมีโค้ดเหมือนเดิมก็ตาม
ถ้าจะใช้ callback ก็ต้องประกาศไว้ก่อน
function raw_json_encode_callback($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})/',
'raw_json_encode_callback',
json_encode($input)
);
}
echo 'Before: ', memory_get_usage(). '<br>';
for ($i = 0; $i < 10000; ++$i) {
raw_json_encode('Hello');
}
echo 'After: ', memory_get_usage();
|
|
|
|
|
Date :
2014-12-05 17:00:54 |
By :
phpinfo() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
แต่จริงๆ json_encode() มันก็ทำงานแบบนี้มาตั้งนานแล้ว และ JavaScript ก็เข้าใจ unicode escape syntax ที่ json_encode() แปลงไป
ซึ่งมันเป็น spec ของ JavaScript ตั้งแต่แรกแล้ว
แม้ตอนที่ PHP ยังไม่มีฟังก์ชั่น json_encode() ต้องไปใช้ Library นอก มันก็แปลงแบบนั้นเหมือนกัน JavaScript ก็อ่านถูกต้องเหมือนกัน
ผมก็ไม่ทราบว่าปัญหาที่คุณเคยเจอมันมาจากไหน เพราะผมไม่เคยต้องหาวิธีแปลงค่าที่ส่งจาก json_encode() ให้เป็นภาษาไทยเมื่ออ่านใน JavaScript เลยครับ
|
|
|
|
|
Date :
2014-12-05 17:05:42 |
By :
phpinfo() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ก็ผมบอกแล้วไงครับ javascript ตอนนั้นผมไม่ค่อยเป้น เพิ่งหัดเขียน web app php html
javascrip นี่ที่หลังเพื่อนเลย ก็รู้โครงสร้าง ไวยกรณ์บ้างนิดหน่อย เรื่องโค๊ดนี่ เสริช หาอย่างเดียวเลย ไม่เป็น
ทุก ภาษา ผมอ่าน แค่ ไวยกรณ์ การใช้ operator การประกาศตัวแปร การใช้ตัวแปร การเขียน ฟังก์ชั่น คลาส เป็นหลักครับ
เรื่อง function นี่จะ เสริชหา เมื่อต้องการใช้ แล้วถึงจะเข้าไปอ่าน document ของคำสั่งนั้นๆ
ส่วนที่เจอปัญหา
ผม echo json ออกมา
var xxx = <?=json_encode( $array )?>;
มันออกมาเป็น \u ก็ไม่ได้นึกนึก คำสั่ง javascript เหมือนเจ้าของกระทู้นี่แหล่ะ
ก็เข้าไปค้นหา โดยกำหนด scope เป็น PHP convert unicode ก็ได้ คำสั่งนี้มา มันก็เท่านี้แหล่ะครับ
ก็ใช้เรื่อยมา ก็เท่านั้น ไม่ได้ไปนึกถึง performance ของเครื่อง เพราะ เป็นคำสั่งที่ไม่ค่อยได้ใช้
เลยไม่เจอปัญหาเครื่องหนักทำงานช้าลง
แต่ได้รู้แบบนี้ผมก็แก้ไปหมดแล้วล่ะครับ ก็ขอบคุณอีกครั้งครับ
และอีกอย่าง ต้องโทษ PHP ออกฟังก์ชั่นนี้มาให้ใช้ โดยไม่ได้คิดถึง performance ของเครื่องหรืออย่างไร
ถ้ามันไม่ดีก็น่าจะ deprecate มันออกไป
ผมอ่านคู่คำสั่ง create_function ใน document PHP
2014-10-16
Edited By: Philip Olson
© 1997-2014 the PHP Documentation Group
ก็ไม่เห็นมี warning บอกไว้เกี่ยวกับ performance
|
ประวัติการแก้ไข 2014-12-05 17:56:10
|
|
|
|
Date :
2014-12-05 17:51:28 |
By :
Chaidhanan |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ไม่ได้ต่างหรอกครับ ผมรู้ว่าทำไม่ถึงใช้ รูปแบบการแสดงผลแบบนั้น
เหตุผลไม่ได้ต่างจาก การทำรูปแบบ ของ base64_encode เลย
เพียงแต่ผมไม่ได้หาว่าจะแปลงมาเป็นภาษาไทย ด้วย javascript เท่านั้นแหล่ะครับ
ผมคิดที่จะแก้จากต้นตอดีกว่า เหมือนกับ ที่ PHP ได้เพิ่ม parameter การแสดงผล ใน version ใหม่ไงครับ
ถ้ามันแก้ที่ต้นตอไม่ดี PHP ก็คงไม่เพิ่่ม parameter นี้หรอกครับ ปล่อยไห้ใช้ \u???? ต่อไป
|
|
|
|
|
Date :
2014-12-05 18:23:38 |
By :
Chaidhanan |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ผมก็ไม่ได้ว่าไงครับ ถ้าเป็น version เก่าผมก็ปล่อยเป็น \u???? อย่างนั้่นแหล่ะครับ
ก็บอกแล้วไงครับ ผมก็แก้ไปหมดแล้ว ไม่ใช่ไม่เห็นดีด้วย เห็นด้วยเลยครับ
แต่ถ้าเป็น version ใหม่ผมก็แค่ใส่ parameter กำหนดการแสดงผล ใหม่ ถ้าอยากได้ อักษรไทย
ส่วน คห 11 ผมแค่บอกว่าผมรู้ว่าทำไม่ถึงได้ทำรูปแบบแสดงผลแบบนั้นไม่ใช่ผมไม่รู้
และสาเหตุสำคัญ ก็ตาม 12 ที่คุณว่านั่นแหล่ะครับ ผมเอาลง database
ข้อมูลมันส่งมา จาก html จับใส่ลงไปใน database
แล้วอ่าค่า ส่งกลับไปให้ html ทำแล้วก็แปลงมันซะทีเดียวเลย จะได้ไม่ต้องไปแปลงกลับอีก
ปล. อีกนิด ที่ว่าไม่ใช่ปัญหา นั่นสำหรับบางคนครับ แต่ผมมองว่ามันเป็นปัญหา ถึงต้องหาทางแก้
ปัญหามันอยู่ที่วิธีการมองของแต่ละคนครับ คุณมีวิธีการแก้การแสดงผลด้วย javascript แต่ผมแก้ด้วย php
ก็เท่านั้่นครับ
ผมแก้ปัญหาจากการแปลงข้อมูลตอนน้ำเข้าข้อมูล เพื่อไปลดปัญหาการแสดงผลภายหลัง
ที่ต้องผ่านคำสั่งแปลงอีกหลายครั้งจากผู้ใช้จำนวนมาก
|
ประวัติการแก้ไข 2014-12-05 19:03:03
|
|
|
|
Date :
2014-12-05 18:50:26 |
By :
Chaidhanan |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ผมต้องการที่จะแปลง jsonที่ส่งมาเป็น javascript object แต่มันขึ้นแบบนี้อะคับ
Code (JavaScript)
function Showdetail()
{
$.ajax({
url: "showQuote.php" ,
type: "POST",
data: ''
})
.success(function(result) {
var obj = JSON.parse(result);
if(obj != '')
{
$("#myBody").empty();
$.each(obj, function(key, val) {
var tr = "<tr>";
tr = tr + "<td>" + val["QT_ID"] + "</td>";
tr = tr + "<td>" + val["QT_DATE"] + "</td>";
tr = tr + "<td>" + val["QT_STATUS"] + "</td>";
tr = tr + "</tr>";
$('#myTable > tbody:last').append(tr);
});
}
});
}
|
|
|
|
|
Date :
2014-12-06 00:16:52 |
By :
top113457 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ตอนนี้ได้แล้วนะคับ
|
|
|
|
|
Date :
2014-12-06 00:29:06 |
By :
top113457 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Load balance : Server 05
|