處理很久搞不定的big5 透過post將資料傳到utf-8的頁面會出現中文亂碼問題...
總算找到個解決方法..記錄起來
轉錄自:Itano Tomomi
asp網頁採用的編碼(encoding)是用系統預設的語系,在windows 2003底下是big5。那該如何將big5轉成utf8呢?這很簡單(不是團結的故事),使用Session.CodePage跟Server.UrlEncode()就可以了。
sourceURL = "http://itanotomomi.akb48/板野友美.htm"
dim i,utf8URL,tmp,encodingStr
for i=1 to Len(sourceUrl)
tmp = mid(sourceUrl, i, 1)
if asc(tmp) < 0 or asc(tmp) > 128 then '將ascii碼在1~128以外的字元當成中文編成utf8
Session.CodePage="65001" '先將網頁設成utf8
encodingStr = Server.UrlEncode(tmp) '將中文編成utf8
Session.CodePage="950" '再將網頁設為Big5
utf8URL = utf8URL & encodingStr
else
utf8URL = utf8URL & tmp
end if
next
dim i,utf8URL,tmp,encodingStr
for i=1 to Len(sourceUrl)
tmp = mid(sourceUrl, i, 1)
if asc(tmp) < 0 or asc(tmp) > 128 then '將ascii碼在1~128以外的字元當成中文編成utf8
Session.CodePage="65001" '先將網頁設成utf8
encodingStr = Server.UrlEncode(tmp) '將中文編成utf8
Session.CodePage="950" '再將網頁設為Big5
utf8URL = utf8URL & encodingStr
else
utf8URL = utf8URL & tmp
end if
next
為什麼要這樣做呢?因為asp使用Server.UrlEncode()進行編碼是採用系統預設的語系,若不更改網頁的語系為utf8,直接使用Server.UrlEncode()的話,會編成big5。而且千萬記得,編成utf8後,要再將Session.CodePage指定回big5,不然以big5為主的asp網站會整個亂掉。
不過若到上面為止,就想直接將encodingStr用response.redirect送出的話,會發現還是找不到網頁。那是因為response.redirect在導向的過程會採用系統預設的語系再編碼過一次...orz...
我目前解決的方式是不用response.redirect,改使用javascript的window.open()。不過缺點是會被瀏覽器擋住。
response.write "<script type='text/javascript'>window.open('" & utf8URL & "');</script>"
以上是純ASP的解決方法,接著介紹透過ASP.NET的解法。
首先是ASP端,將url編碼丟給ASP.NET。這邊採用預設編成big5就可以了,反正主要處理在ASP.NET端。
sourceURL = "http://itanotomomi.akb48/板野友美.htm"
Response.Redirect "http://itanotomomi.akb48/passUTF8.aspx?q=" & Server.UrlEncode(sourceUrl)
Response.Redirect "http://itanotomomi.akb48/passUTF8.aspx?q=" & Server.UrlEncode(sourceUrl)
接著在passUTF8.aspx.cs的Page_Load(若使用VB則是passUTF8.aspx.vb)中撰寫下面的語法。
string sourceURL = Request.Url.Query;
sourceURL = HttpUtility.UrlDecode(sourceURL, Encoding.GetEncoding("big5")); //將asp用big5傳來的url decode
sourceURL = sourceURL.Replace("?q=", "");
Response.Redirect(sourceURL);
sourceURL = HttpUtility.UrlDecode(sourceURL, Encoding.GetEncoding("big5")); //將asp用big5傳來的url decode
sourceURL = sourceURL.Replace("?q=", "");
Response.Redirect(sourceURL);
因為ASP.NET使用utf8,所以將asp傳來的url編成utf8後就可以直接使用Response.Redirect()丟出去了。
沒有留言:
張貼留言