作者buganini (霸格尼尼)
看板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)