2009-09-21 47 views
10

我們有一個使用經典ASP的網站。經典ASP文本替換和UTF-8編碼

我們發佈過程的一部分將文件中的值替換爲文件中的值,我們發現了一個錯誤,它會將文件寫爲UTF-8。

這會導致我們的應用程序開始吐出垃圾。撇號以某些編碼字符的形式返回。

如果我們接着去除表示此文件爲UTF-8的BOM,則以前呈現爲垃圾的文本現在可以正確顯示。

當遇到UTF-8文件時IIS有什麼不同嗎?

+0

如果刪除UTF-8 BOM導致頁面正確呈現則內容是不是UTF-8肯定? – AnthonyWJones 2009-09-22 06:48:20

回答

6

UTF-8不使用物料清單;在某些微軟軟件中,這是一個令人討厭的錯誤特性,使它們存在。你需要找到你的發佈過程在你的文件中放入一個UTF-8編碼BOM,並修復它 - 你應該停止,即使你使用UTF-8 ,現在真的是最好的。

但我懷疑這是IIS導致顯示問題。瀏覽器更可能猜測最終顯示頁面的字符集,並且當它看到看起來像是UTF-8編碼的字節時,它會猜測整個頁面是UTF-8。您應該能夠通過使用HTTP頭指出一個明確的字符集,以阻止它這樣做:在HTML

<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1" /> 

Content-Type: text/html;charset=iso-8859-1 

和/或meta元素現在(假設ISO-8859- 1實際上是你的數據所在的字符集),它應該顯示OK。但是,如果您的文件在開始時真的具有UTF-8編碼的BOM,現在您將在頁面中看到「」,這些字節在ISO-8859-1中是這樣的。所以你仍然需要擺脫那個misBOM。

+0

這是有道理的。 這實際上是一些專門爲處理這類問題而編寫的代碼中的一個錯誤。 謝謝。 – 2009-09-21 12:51:44

+1

我必須承認這個答案令我困惑。「UTF-8不使用物料清單」,你能否說得通嗎?這是一種「錯誤」?我從來沒有遇到過使用包含這個零寬度空格字符的UTF-8文件的問題,你遇到了什麼問題? – AnthonyWJones 2009-09-22 06:50:41

+0

任何基於字節的文本工具(例如shell,配置文件加載器等)將在文件開始處顯示「」時立即翻轉; UTF-8的明確目標是與對Unicode一無所知的工具兼容,但UTF-8 + BOM打破了這一點。即使一些支持Unicode的工具也會跳過它,因爲只有預期BOM存在並且通過UTF-16的Unicode解碼過程自動刪除。 UTF-8 + BOM打破了應用程序,在Unicode規範中沒有理由使用它;甚至沒有任何好處,因爲UTF-8沒有字節順序問題。 – bobince 2009-09-22 12:48:23

13

我正在尋找在完全相同的問題,昨天碰到:

http://blog.inspired.no/utf-8-with-asp-71/

重要組成部分,從該頁面,如果它消失了......

ASP代碼:

Response.ContentType = "text/html" 
Response.AddHeader "Content-Type", "text/html;charset=UTF-8" 
Response.CodePage = 65001 
Response.CharSet = "UTF-8" 

和以下HTML META標記:

<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /> 

我們使用元標記和asp CharSet屬性,但頁面仍然沒有正確呈現。將其他三行添加到asp文件後,所有工作都完成了。

希望這會有所幫助!

+1

您不需要元標記和'Response.CharSet =「UTF-8」',因爲它們都用於相同的目的,我個人更喜歡使用'Response.CharSet =「UTF-8」'而不是明確設置它作爲[tag:HTML]中的元標記。另外'Response.AddHeader「Content-Type」,「text/html; charset = UTF-8」'只是寫'Response.ContentType =「text/html」'和'Response.CharSet =「的顯式形式」UTF- 8「'你所暗示的是毫無意義的,堅持使用'Response.ContentType'和'Response.CharSet'。 – Lankymart 2014-02-05 10:51:34

+0

非常hepfull @Werewolf thx你爲你的貢獻.. – Artemination 2015-01-16 15:31:51

+0

你救我的生命:) – kyawagwin 2015-08-21 02:15:56

2

如果您在使用Access數據庫,你應該寫

Session.CodePage=65001 
Set tabtable= Conn.Execute("SELECT * FROM table")