同事報案,某上古神獸古老 ASP VBScript 移至 Windows 2012R2 x64 主機後執行出誤,深入追查,問題出在執行 ASC() 解析中文字元一律傳回 63 (?)。
首先聲明,ASC() 並不支援 Unicode,理應改用 ASCW() (參考:1 2),但舊程式汰換在即,能運行就不想投資時間修改重測。程式原本在 Windows 2003 x86 執行正常,一開始以為是 Windows 版本較新造成 VBScript ASC() 行為改變,寫了一小段檢測程式在本機 Windows 10 測試,一樣是新版 Windows,執行結果卻與問題主機不同:
WScript.Echo ASC("黑")
WScript.Echo ASCB("黑")
WScript.Echo ASCW("黑")
陸續找了 Win 8.1、Win 10、Win 2008R2、Win 2012R2,中文英文都有,發現所有主機的執行結果都跟舊主機一致,唯一傳回 63 的只有出問題的 Win 2012R2。
相同作業系統卻有不同結果,問題又可反覆重現,只要找出正常主機跟問題主機的環境差異,就能找出答案。
最後,關鍵在意想不到的地方!
問題主機的國別格式被設成「Match Windows display language」,由於是英文版,啟用中的國別設定是 English(United States),而其他測試正常的主機格式設定都是台灣。而將原本正常的英文版 Windows 2012R2 格式改成 United States,也能重現 ASC(中文字元) 傳回 63 的現象。實驗如下:
這也太奧妙了,我一直以為格式只影響的是日期、時間、數字的格式偏好,語系編碼應該是看 System Locale 才對(如下圖所示,安裝時早已設好 Chinese (Traditional, Taiwan) ),萬萬沒想到 VBScript 的 ASC() 傳回值竟會受日期、數字格式設定影響!
問題在調整國別格式設定後排除,但留下一個疑點。問題主機為 Web Farm,事後檢查多台主機的格式都被改成 Match Windows display language,眾人都有印象當初已調整成台灣,有什麼原因造成整批主機設定異動,原因成謎。