【茶包射手日記】VBScript ASC() 中文傳回 63

同事報案,某上古神獸古老 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,眾人都有印象當初已調整成台灣,有什麼原因造成整批主機設定異動,原因成謎。

歡迎推文分享:
Published 26 April 2017 07:51 AM 由 Jeffrey
Filed under:
Views: 3,341



意見

沒有意見

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<April 2017>
SunMonTueWedThuFriSat
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456
 
RSS
創用 CC 授權條款
【廣告】
twMVC

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication