顯示具有 unicode 標籤的文章。 顯示所有文章
顯示具有 unicode 標籤的文章。 顯示所有文章

2009年9月25日 星期五

PHP的utf-8斷句

PHP的substr遇到UTF-8字元,沒切到邊界時.會出現亂碼。所以就要判斷UTF-8有幾個字節。

function moss_truncate($str, $cut) {
$len = strlen($str);
$count = 0; // count
$i = 0; // cut index

if($len < $cut)
return $str;

do {
if($count >= $cut)
return substr($str, 0, $i) . '...';

$value = ord($str[$i]); // ASCII value
if($value > 191 and $value < 224) // 2 bytes
$i+=2;
elseif($value > 223 and $value < 240) // 3 byte
$i+=3;
elseif($value > 239 and $value < 248) // 4 bytes
$i+=3;
else // others, include ASCII (less than 128)
$i++;

$count++;
} while($i < $len);
return $str;
}

$str = '蘑d,プリプリで美味';
echo moss_truncate($str, 8); //取8個"字", 不管是ASCII還是Unicode都算一個字
// 結果:
// 蘑d,プリプリで

參考:
解決中文字串的斷字問題?
PHP如何判斷是否為utf8編碼文件的方法

2009年9月7日 星期一

編輯器的編碼::Editor's Coding

用Windows的筆記本(Notepad)打om二字, 然後按Enter, 再打個, 存成不同的編碼來看:

ANSI:
6F 6D 0D 0A D4 7B
UTF-8:
EF BB BF 6F 6D 0D 0A E5 94 B5
Unicode(預設是little-endian):
FF FE 6F 00 6D 00 0D 00 0A 00 35 55

* 0D 0A是ASCII的CR LF, Windows用的換行, Unix則用LF, Mac用CR. 所以windows編過的檔案到Linux上常會看到^M的標誌. [LF(Line Feed) 就是換行, CR(Carriage Return)是因為以前用電報機, 換行後還是回到第一格.]
* Unicode編碼開頭的U+FEFF是BOM(byte-order mark), UTF-8的BOM則是EF BB BF 
* 唵的Unocode

Emacs:
C-h C ENTER (看現在的coding)
M-x list-coding-systems (列出全部coding system)
C-x ENTER f coding ENTER (改用coding system)
C-x ENTER c coding ENTER (用coding system來看目前的buffer)

Vim:
" 設定自動轉換為 UTF-8 編碼
set fileencodings=utf-8,big5,euc-jp,gbk,euc-kr,utf-bom,iso8859-1 "在讀寫檔案的編碼
set encoding=utf8
set tenc=utf8
set ff=unix

如果PHP讀到有BOM格式的檔案, 會當成一般字元輸出, 如果用到header()要導向別頁時,就會出現:

Cannot modify header information - headers already sent...的錯誤訊息

2009年8月24日 星期一

emacs的unicode

emacs 23有了unicode支援
趕快把預設改成utf-8,才有安心的感覺~
;; set up unicode
(prefer-coding-system 'utf-8)
(set-default-coding-systems 'utf-8)
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)