※ 本文為 dinos.bbs. 轉寄自 ptt.cc 更新時間: 2013-02-25 08:23:33
看板 PHP
作者 標題 Re: [請益] move_uploaded_file 失敗
時間 Mon Feb 25 06:19:35 2013
就分三層,兩個作業系統來看好了
encoding夾在兩層中間表示這兩層間用溝通用的編碼
Windows Linux
UI
UTF-8 UTF-8
PHP
ANSI UTF-8
FS
上表中,寫UTF-8的部份是可以自己改的,不過當然是建議用UTF-8,
在中文環境的Windows下ANSI指的是Big5,這是官方版PHP的限制,沒得改,
Windows上用UTF-8的話就必然會跟FS用不同編碼,
所以PHP比需處理上下兩層的轉換。
Windows上PHP只能用ANSI的原因如下︰
類似上表,在FS及更底層的地方其實是
FAT/NTFS EXTFS
PROGRAM
ANSI UNICODE 隨便傳
FS \ /
UCS-2 隨便放
DISK
EXTFS以及大部分其他POSIX系統用的檔案系統都不做編碼處理,
指要求跟ASCII相容,擋掉一些保留字元,
剩下的收什麼存什麼,讀到什麼就吐回去
至於FAT/NTFS
存的是UCS-2(Unicode的一種編碼),但因為UCS-2是定長2 bytes,
所以中間一定會有很多0,譬如原本ASCII的"123",16位元看起來是"\x31\x32\x33",
但在UCS-2看起來會是"\x00\x31\x00\x32\x00\x33" 然而00在C-style的字串中是用來
作為字串結尾,也就是說UCS-2是跟ASCII不相容的,所以要嘛讓編碼去適應程式,要嘛
改程式來支援編碼(用wide char),這兩種作法在Windows API上就分成了兩套系統,
PHP在其他系統上都快快樂樂的使用,因為其他系統都儘可能用ASCII相容的編碼,
但到了Windows上要改程式不是一件小工程,所以PHP一直以來都是用讓編碼去適應程式
的那套API,就這樣。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.221.51.22
※ 編輯: buganini 來自: 61.221.51.22 (02/25 06:20)
--
※ 看板: dinos 文章推薦值: 0 目前人氣: 0 累積人氣: 219
回列表(←)
分享