【茶包射手日記】VS2008部署專案編碼問題
3 |
這是今天遇到的問題,沒時間完全解開謎團,僅記載處理經過如下:
同事使用VS2008中文版,以VS2008 Web Deployment Project將其編譯成DLL上傳至測試機,發現其中有一段"SELECT Col1, CASE WHEN Col2=1 THEN '中文一' ELSE '中文二' END As ColX FROM ..."的PL/SQL語法,查詢結果在網頁上的呈現,Col1正常顯示,ColX則出現三個問號(?)。
原以為是.cs編碼問題,將aspx/aspx.cs都Copy至測試台,不使用bin下編譯好的DLL。此時將.cs試改存BIG5及UTF-8都得到一樣結果,我立劇將槍口改瞄右上角,碰! 打下一枚茶包--Registry HOME0的NLS_LANG未設成中文。(註: 改完要IISRESET才會生效)
本以為問題已解,但同事將ASPX再改回使用編譯過的DLL,ColX雖不再是問號,卻出現亂碼,看來.cs的Encoding還是有問題。
找不到Web Delpoyment Project設定File Encoding地方,求其次在ASP.NET web.config中加入globalization設定: <globalization fileEncoding="utf-8" requestEncoding="utf-8" responseEncoding="utf-8" />
重Build DLL後問題排除~~~
只是我查到ScottGu網站上有相關討論:
private static void FixWebSourceFile(FileInfo file, Hashtable assemblyMapping)
{
....
using (StreamReader reader1 = new StreamReader(file.FullName, true))
{
text1 = reader1.ReadToEnd();
encoding1 = reader1.CurrentEncoding;
}
....
由此推論aspnet_merge.exe應會在讀檔時自動決定編碼,為何加入web.config globalization設定可以解決問題,這部分暫無合理解釋。
Comments
# by Alex So
在中文前加 "N" 是不是可以解決你的亂碼問題呢? "SELECT Col1, CASE WHEN Col2=1 THEN N'中文一' ELSE N'中文二' END As ColX FROM ......"
# by Jeffrey
to Alex So, 加N多半用來解決"BIG5有的中文字正常,Unicode難字變問號"的情形(參考: http://bit.ly/bMEAps ),當BIG5有的中文字也變問號時,多半是Oracle Client的編碼設定不吻合。以上經驗供參考。
# by 林凱西
請問站長有興趣寫試用文嗎?懇請回覆,我將提供更詳細的訊息~^^ telmotosky702681@kimo.com