Month: April 2015

[PHP] 使用 json_encode 的字串編碼必須為UTF-8

剛好有機會碰到這個問題,雖然發現原因也解決了,但也花了我一些時間,所以…筆記筆記

只要有利用PHP寫過API或將server side的資料吐給client side用js處理相關的應用,對PHP的json_encode應該不陌生,但這個好東西使用上也有一些限制,其中有一項就是它只吃UTF-8編碼的字串!官方文件也有提到:

All string data must be UTF-8 encoded.

因為最近碰到DB的charset不是UTF-8,然後我又依照以前的方式,把資料從DB撈出來之後就直接:

echo json_encode($arr);

但這會有問題,例如字串的編碼不是UTF-8,像這樣:

$arr = array(
'id' => 1,
'description' => '我不是UTF-8編碼的字串唷!'
);
echo json_encode($arr);

echo的結果會是:

{"id":1,"description":null}

一開始的時候還以為是我下的SQL select statement沒寫好,後來才發現是編碼的問題,這邊有兩個方法解決這個問題

1.使用urlencode和urldecode

原理:先使用urlencode將非UTF-8的字串轉換,然後echo json_encode的時候在urldecode:

echo urldecode(json_encode($str));

2.使用mb_convert_encodeing或iconv

先將非UTF-8的字串轉為UTF-8,然後在echo json_encode時,再把字串轉回非UTF-8編碼

echo mb_convert_encoding($str, "UTF-8", "BIG5");

恍然小悟

確認是編碼的問題後,也讓我突然理解為何echo json_encode($str)的中文字在瀏覽器上看都會變成\uxxxx

Advertisements

與Kubuntu14.04筆電的省電之旅

前言就像自言自語

兩年前我曾經寫過一篇「關於Ubuntu安裝在筆電需要解決的事情」,主要是把當時碰到ubuntu裝在筆電上太耗電的解決方式做個紀錄,但現在回頭看看,發現裡面很多連結和資訊已經不存在或過時了,而且因為裝了很多自己不瞭解的套件,系統也變得怪怪的,所以利用這次機會把我瞭解和目前正在使用的省電方式紀錄一下

基本上,只要把Linux裝在筆電上都會遇到「太耗電」這個問題,除非是買已經內建好Linux的筆電,才不會遇到這些問題,因為在出廠前已經做過調校了,但其實這在台灣很不好買,也幾乎沒人會買(笑),雖然還滿想買的…

嚇不倒我der

這次重新把筆電裝上Kubunu讓我最驚訝的事情是,達到我要的省電效果我只裝了兩個套件和調整configuration file的設定,就從原本撐不過一小時的續航力變成可以撐到超過三小時, 考量到這台Acer Aspire 4830TG,已經用了5年而且電池從來沒換過,這已經很不容易了…重要的是我還沒完全設定好針對這台筆電的最佳化調整,所以,我樂觀的認為得至少可以撐到超過4小時,當然,上述說的續航力,其實和使用行為有很大的關係,如果是玩遊戲和看線上flash影片當然無法撐得那麼久,但只是寫寫code或上上網真的可以做到!

節能減碳之旅

只需要帶上兩個package

laptop-mode-tools

sudo apt-get install laptop-mode-tools

cpufreqd

sudo apt-get install cpufreqd

建議裝完之後重啟系統

sudo reboot

將以上兩個套件裝完,就會自動設定在開機完成的時候啟用,保險起見,重開機完成的時候可以下個指令檢查一下:

檢查cpufreqd是否正在運行

ps aux | grep cpufreqd

check_cpufreq_process

檢查laptop-mode-tools目前的狀態

sudo laptop_mode status | grep 'exists'

check_laptop_mode_status

設定檔路徑

laptop-mode-tools

/etc/laptop-mode/

cpufreqd

/etc/cpufreqd.conf

追求省電的情況下,調整configuration file的原則就是在沒有插電的情況下(AC off)cpu的maxfreq頻率不要調得太高

其實裝完上述兩個套件,我對於筆電的續航力就超有感der~

還有一些額外的設定,還可以讓筆電的續航力更加提升

1.在沒有插電源時,螢幕亮度不要調太亮

on_battery_screen_brightness

2.使用內建顯卡

trun_on_intel_card

3.關閉藍牙功能turn_off_bluetooth

若目前正在使用藍牙,建議至少要關閉自動偵測藍牙裝置的功能