作者 主題: 如何讓apache支援utf-8編碼的檔案請求?  (閱讀 7701 次)

0 會員 與 1 訪客 正在閱讀本文。

b90220208

  • 鑽研的研究生
  • *****
  • 文章數: 557
    • 檢視個人資料
如題:
如何讓apache支援utf-8編碼的檔案請求?
例如client請求perl檔案時,apache需要去讀取shebang line(即該檔的第一行),才曉得要去哪找perl處理程式.

我自己試過若將perl以xp預設的ANSI編碼存檔則沒問題.
而若以utf-8存檔,當用browser瀏覽時會出現如下錯誤訊息:
======================================================
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator, [no address given] and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.


======================================================
以下為apache的log file紀錄:
----------------------------
[Sat Apr 09 15:18:19 2005] [error] [client 203.204.136.209] e:/appserv2-5-1/www/hello4.pl is not executable; ensure interpreted scripts have "#!" first line

[Sat Apr 09 15:18:19 2005] [error] [client 203.204.136.209] (2)No such file or directory: couldn't spawn child process: e:/appserv2-5-1/www/hello4.pl

很顯然,APACHE找不到以#!為開頭的shebang line,
問題是我的perl檔案可是有在第一行明確寫上#!e:\perl\bin\perl.exe,
所以我懷疑是apache看不懂以utf-8編碼的perl檔案,才會導致此一錯誤訊息...

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5409
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
如何讓apache支援utf-8編碼的檔案請求?
« 回覆 #1 於: 2005-04-11 18:19 »
用不會產生 unicode BOM 的程式去編輯你的程式.
或想辦法把你的每個程式開頭的三個 BOM 字元拿掉.

b90220208

  • 鑽研的研究生
  • *****
  • 文章數: 557
    • 檢視個人資料
如何讓apache支援utf-8編碼的檔案請求?
« 回覆 #2 於: 2005-04-11 18:48 »
引述: "twu2"
用不會產生 unicode BOM 的程式去編輯你的程式.
或想辦法把你的每個程式開頭的三個 BOM 字元拿掉.


我查了一下資料,大致了解win32系統下的文檔習慣以特定字元 (慣稱為 BOM: Byte-Order Mark) 開頭,來表示該文檔是採 BE 或 LE 方式編碼.
大概是APACHE在接收到perl文件請求時,假如httpd.conf中的定義是交由由shebang line明定之路徑下的perl解譯器處理,那麼apache就得去讀取perl文件的第一行,這時問題就出現了,因為apache看不懂BOM這一特殊用途字元,且剛好BOM又位於文件第一行之開端,所以才會導致client browser接收到"伺服器無法處理的內部問題等錯誤訊息..."

Q1:
只是我還是不了解,ANSI編碼儲存網頁文件時不也有BOM的情形嗎?
為何用ANSI就沒事,UTF-8就有事??

Q2:
為何APACHE會看不懂BOM字元呢?
(難道它不支援UTF-8嗎?)

Q3:
順便請教,
一般編寫網頁檔案需要注重編碼的選擇嗎?
若想讓文件更有可攜性,例如移轉於linux與windows之間,
是否以utf-8編碼網頁相關文件較好呢?

b90220208

  • 鑽研的研究生
  • *****
  • 文章數: 557
    • 檢視個人資料
如何讓apache支援utf-8編碼的檔案請求?
« 回覆 #3 於: 2005-04-13 14:57 »
:D 我大概有頭緒知道怎麼問了,由於perl在5.6版以後就已支援utf-8,所以其compiler是ok的.

Q1:
問題只在apache這個本以unix為主的套件看不懂win32系統特有的BOM,所以才會有無法解讀shebang line的問題,當然也就找不到perl compiler來處理client請求的perl文件.但若以此認知,那麼改成ANSI編碼存檔時難道就無BOM的問題嗎?
因為Win32系統習慣會對文檔加上BOM字元來區分文件屬於BE或LE...

[補充]: 關於 Byte-Order Mark,這是我找到的解釋:
---------------------------------------------------------------------------------------------------------  
先說明一下什麼是 Byte-Order:在一些平台上,是把代表數值較大的 byte 放在前面,這稱為 Big Endian (BE) 的系統;有些平台則相反,是把代表數值較小的 byte 放在前面,稱為 Little Endian (LE) 的系統。

若採 LE 方式編碼,BOM 會表示為 0xFF 0xFE,而在 Unicode 的定義中是不存在 U+FFFE 這個字元的.

若採 BE 方式編碼,BOM 會表示為 0xFE 0xFF,而 U+FEFF 剛好是在 Unicode 中的有效字元,代表的是一個不佔空間的 space 符號,所以即使沒被解釋為 BOM,也不會對閱覽者產生錯誤的訊息.
----------------------------------------------------------------------------------------------------------

Q2:
因此,會不會是出在utf-8本身,
由於它沒有BOM的支援,所以當我存檔時,windows的記事本程式會為文件標上 U+FEFF 字元.
而當apache收到perl的文件請求進而去讀取shebang line時(這點我不確定正確與否,因為在其他討論區看過有人說什麼apache不會去讀文件只會傳送文件...的論調,so,若您清楚的話還請您為我釐清,在此我先假設apache會讀取請求的文件),所以假設文件是用ANSI編碼,那麼BOM會被正確解讀,
但若文件是以UTF-8存檔,即便apache有支援utf-8,但若讀到BOM時,它不是當成space就是認為無意義...而不管何者發生,就如前所說,因為在 Unix 系統有所謂的 magic word,即以檔案的前兩個 byte 來辨識該檔的性質.例如 perl script 檔的shebang line,開頭必定是 "#!".因此原就是以 unix 為主的 apache 也就無法判讀....因此client 端的 browser 才會收到"伺服器的內部錯誤..."訊息.


Q3:
關於:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
我當然有寫上,也正因如此browser還會把中文字顯示成亂碼我才搞不懂??

p.s 不好意思,再次說明我的情形:
我將原先以ANSI存檔的網頁文件重新以記事本或者EmEditor存成utf-8,使用後者時我還選擇不加上BOM這一特殊用途字元,且也以CR+LF的windows預設換行的方式重新存檔.....當然我也有在browser工具鈕的"檢視"中的"編碼"選擇"自動選取".....god! 快來救救我啊!


Q4:
最後就是ANSI與BIG5有什麼不同?
You know,關於
<meta http-equiv="Content-Type" content="text/html; charset=big5">
為何不能寫成
<meta http-equiv="Content-Type" content="text/html; charset=ansi">
以往編寫網頁文件時都是以ansi存檔,即表示其也支援"中","英"字元符號不是嗎?


*******************************************************************
為免於我的解讀有誤,以下附上我所查詢的BOM等資訊來源:
http://mfhsieh.blogspot.com/2005/03/pda-zaurus-c760-35-utf-8-and-bom.html
 :oops:  :oops:  :oops:

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5409
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
如何讓apache支援utf-8編碼的檔案請求?
« 回覆 #4 於: 2005-04-13 15:10 »
apache 不支援 BOM, 所以只要你把 BOM 移除就可以正常使用. (裡頭仍是使用 utf-8)

ANSI 的檔案並沒有 BOM 在檔案開頭.

請用不會產生 BOM 的編輯器來編寫你的 script 或網頁.

另外, #! 不是只有 perl 用, 你的觀念有問題. 只要是要指定某個程式來解譯這個 script, 都是用 #! 來表示.

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5409
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
如何讓apache支援utf-8編碼的檔案請求?
« 回覆 #5 於: 2005-04-13 15:17 »
另外, apache 請在設定檔加上 AddDefaultCharset utf-8 才會在 http 的 header 中加上 utf-8, 你的 browser 才會知道預設的編碼是 utf-8.

b90220208

  • 鑽研的研究生
  • *****
  • 文章數: 557
    • 檢視個人資料
如何讓apache支援utf-8編碼的檔案請求?
« 回覆 #6 於: 2005-04-13 22:34 »
引述: "twu2"
另外, apache 請在設定檔加上 AddDefaultCharset utf-8 才會在 http 的 header 中加上 utf-8, 你的 browser 才會知道預設的編碼是 utf-8.

請教關於您說的在apache httpd.conf加入AddDefaultCharset utf-8 這一動作,

在網頁文件中加下面這行
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
這兩個動作是否為同一目的,若是,是否任作其一即可?

不論是在httpd.conf還是<meta>的 charset設定,請教有大小寫之差嗎?

Darkhero

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3728
  • 性別: 男
    • 檢視個人資料
    • ㄚ凱隨手紀
如何讓apache支援utf-8編碼的檔案請求?
« 回覆 #7 於: 2005-04-13 23:45 »
apache 中的 AddDefaultCharset utf-8 跟 網頁中的 meta 的 charset 效用應該是一樣...
但是不同的瀏覽器會因為解譯的方式不同...
有的優先認 apache 送出來的 header 有的認 像是 php or perl 等送出來的 header ...
有的則是優先參考 html 內容的 meta ...

設定 AddDefaultCharset 是讓 apache 送出的 header 會說是 utf8 編碼...
希望我們的討論是為了把問題解決,而不是爭論誰對誰錯.
『灌水才是重點,發文只是順便』
『我寧可讓不會釣魚的工程師餓死,也不想讓會餓死的工程師去攪沉公司....』
Blog: http://blog.darkhero.net/
秘密基地: http://www.darkhero.net/comic/
目前服務的網站: http://www.libook.com.tw/

b90220208

  • 鑽研的研究生
  • *****
  • 文章數: 557
    • 檢視個人資料
如何讓apache支援utf-8編碼的檔案請求?
« 回覆 #8 於: 2005-04-14 18:56 »
一般用windows的記事本存寫好的網頁文件時都會有個編碼選擇:
utf-8
unicode
ansi...

Q1:
我想問的是,其 ANSI 指的是 BIG5 還是單純的 ASCII code呢?
(由於其能儲存中文字元所以我會猜是BIG5...不知對不對?)

我會這樣問是因為:
一個是雙位元組,一個則是單位元組,
前面前輩有提到 BOM 是WIN32為多位元組編碼系統設計的,既如此,
當我的 perl script 以 ANSI 存檔時為何不會有 BOM 的問題呢?

Q2:
若Q1的答案是BIG5,
那麼例如我由XOOPS,MT BLOG等網站抓下來的檔案,我想若非以UTF-8就是以ANSI(ASCII)為編碼的吧.
既如此,為何當我以記事本開啟這些文件時都能正常顯示呢?

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5409
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
如何讓apache支援utf-8編碼的檔案請求?
« 回覆 #9 於: 2005-04-14 20:24 »
對繁體中文來說, ansi 就是 codepage 950, 也就是 big5 碼.
對簡體中文來說, ansi 就是 codepage 932 (? 好像是), 也就是 gb 碼.

ansi 的檔案沒有 BOM 這東西, 系統在打開一個檔案時, 如果沒有 BOM (不同的 unicode 編碼, 有不同的 BOM 的樣子), 就是 ansi.

所以.... 你的問題, 還是問題嗎?

並不是一定要有 BOM, 那個檔案才能存放 unicode, 這是完全無關的. unicode 也是 1-n 個 byte 算成一個字元, 一個個 byte, 對檔案都一樣.

你抓的檔案一定可以正常顯示嗎? 如果是 Big5 碼你硬要用 utf8 去解釋, 還是正確的嗎?
那為什麼有些網頁的編碼在 browser 無法正確判斷時, 你還是可以看到內容呢? 只是用錯的編碼看, 是亂碼吧了.

舉例來說, 你認為 A-Z 這 26 個字母就只有英文在使用嗎? 只要是檔案內的所有字都是這 26 個字母的組合, 這個檔案就是一份英文文件嗎?

b90220208

  • 鑽研的研究生
  • *****
  • 文章數: 557
    • 檢視個人資料
如何讓apache支援utf-8編碼的檔案請求?
« 回覆 #10 於: 2005-04-17 12:08 »
還有關於MySQL如何支援UTF-8呢?
(因我在安裝APPSERV v2.5.1時發現它雖支援相當多的編碼,但就是找不到有utf-8可選)

-------------------
php4,5版本的"字串相關函式"例如有切割,擷取字數,置換字元...等
其原理是都是將一個byte當作一個字元嗎?
若是,換句話說,也僅限於處理ASCII或者是BIG5,UTF-8等的英文數字類的字元了嗎?
至於碰到多位元字元時要嘛不是誤切就是誤判...對嗎?
....到現階段為止,是否都還未有能夠處理UNICODE之類的"字串函式"支援嗎?
若是,那MySQL改成UTF-8還是個好的決定嗎?
這樣往後遇有要切割字串時,豈不是還要再作轉碼成BIG5,然後再以特定能處理BIG5的函式去處理...如此頗為麻煩的...還是有更好的解決方案呢?

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5409
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
如何讓apache支援utf-8編碼的檔案請求?
« 回覆 #11 於: 2005-04-17 12:21 »
如果你存到 mysql 的資料, 有 big5 之外的字, 那你不用 utf-8 要怎麼存?
如果你保證存進去的一定會是 big5 的字, 那麼用 utf-8 的確沒什麼好處, 反而是浪費空間.

問題是.... 你的需求是什麼呢? 就目前的網站來說, 會使用超出 big5 的字發生的可能性不小, 所以.... 這也是為什麼 utf-8 會成為那些網站的選擇了.

切割字串? 看你的需求吧. 也許有別的方式可以處理. 怎麼處理? 如果沒人做,  表示沒人有這個需求吧. 你有... 應該是你自己想吧.
轉成 big5 再做? 你確定轉過去還是同樣意義的字嗎? 如果是不存在於 big5 的字, 轉過去那個字可能就不見了.

PS. 你有看過 php 相關的 mb_xxx() 嗎? 這些函式的設計似乎都符合你的需求吧.

b90220208

  • 鑽研的研究生
  • *****
  • 文章數: 557
    • 檢視個人資料
如何讓apache支援utf-8編碼的檔案請求?
« 回覆 #12 於: 2005-04-19 11:16 »
請教關於mbstring.encoding_translation :
----------------------------------------------------------------------------------------------------------
# Beginning with PHP 4.3.3, if enctype for HTML form is set to multipart/form-data and mbstring.encoding_translation is set to On in php.ini the POST'ed variables and the names of uploaded files will be
converted to the internal character encoding as well. However, the conversion isn't applied to the query keys.

mbstring.encoding_translation = Off/on
----------------------------------------------------------------------------------------------------------

mbstring.encoding_translation 設定為on有何好處?
(一般適合設成on的情況是什麼呢?)

何謂:HTTP output character ?

是指當php的輸出嗎?


------------------
另外請教apache的httpd.conf中有一行如下是作什麼的?
AddType application/x-httpd-php-source .phps