孫 毅 ,鮑艷香
(1.南京南瑞水利水電科技有限公司,南京 210003;2.水利部水文儀器及巖土工程儀器質(zhì)量監(jiān)督檢驗(yàn)測試中心,南京 210012)
隨著這些年中國水力發(fā)電廠監(jiān)控技術(shù)的日趨成熟,越來越多的國外水力發(fā)電廠項(xiàng)目開始使用國內(nèi)水力發(fā)電廠監(jiān)控產(chǎn)品。與2000—2010年已實(shí)施過的部分國外項(xiàng)目不同,新的需求不再僅是單一的英文版軟件,法文、西班牙文、葡萄牙文等其他語言版本軟件需求也逐漸出現(xiàn)。為了滿足小語種國際化項(xiàng)目的需求,南京南瑞水利水電科技有限公司開發(fā)了新一代國際化水力發(fā)電廠監(jiān)控軟件產(chǎn)品(SC2000)。早期的水力發(fā)電廠監(jiān)控軟件因?yàn)橹恍枰С种形募坝⑽模褂昧恕癎BK”字符集,該字符集可支持所有的簡體中文、繁體中文、英文等字符,但無法兼容某些小語種中的一些特殊字符,如:ê、、?等等。實(shí)際上,在現(xiàn)在的軟件開發(fā)中,更為廣泛使用的是“UTF-8”字符集,這一字符集可以兼容幾乎所有的字符,包括小語種中的各種特殊字符。因此,如果需要兼容各種小語種,還需將軟件使用的字符集更改為“UTF-8”字符集。然而,傳統(tǒng)的軟件前后臺采用了不同的編程語言,前臺為JAVA語言,后臺為C語言,兩者之間的各類信息傳輸都使用了“GBK”字符集作為編碼模式,如果僅修改其中某一方的編碼方式,會造成前后臺字符集的不兼容,導(dǎo)致軟件出現(xiàn)大量亂碼。并且原來的軟件中,大量配置文件也使用了“GBK”編碼,直接對軟件編碼方式進(jìn)行修改,會造成無法兼容以前的項(xiàng)目,對后續(xù)的維護(hù)工作造成嚴(yán)重的影響,需進(jìn)行軟件版本的分支。
軟件國際化最終需要實(shí)現(xiàn)的目標(biāo)是:在不對軟件進(jìn)行重新編碼或者替換運(yùn)行文件的基礎(chǔ)上,可以通過只修改一個運(yùn)行參數(shù),或者直接在界面上選擇的方式,切換軟件界面上顯示的語言。一般實(shí)現(xiàn)目標(biāo)的策略:在軟件中所有需要出現(xiàn)文本顯示的地方,都避免在軟件中采用硬編碼,通過鍵值對查找策略來實(shí)現(xiàn),即在代碼中需要顯示文本的地方,通過某一個“key”,去找出資源文件中對應(yīng)的“value”,最終把“value”顯示出來?!発ey”是固化在軟件源代碼中,而獲取 “value”可以根據(jù)配置不同,去獲取資源文件中不同的語言文字。
總體來說,軟件國際化是一套成熟的軟件所必備的體系,對軟件的可維護(hù)性、可擴(kuò)展性都有極大的幫助,比如避免在需要修改軟件語言時,需要去對軟件進(jìn)行重寫編碼。
字符是各種文字和符號的總稱,包括各國家文字、標(biāo)點(diǎn)符號、圖形符號、數(shù)字等。而字符集是多個字符的集合,字符集種類較多,每個字符集包含的字符個數(shù)不同,常見字符集有ASCII字符集、GBK字符集、UTF-8字符集、UTF-16字符集、ISO-8859-1字符集。在列出的5種字符集中,除ASCII字符集外,其余均支持簡體漢字。計算機(jī)要準(zhǔn)確的處理各種字符集文字,就需要進(jìn)行字符編碼,以便計算機(jī)識別和存儲各種文字。其中,ASCII字符集包含所有的基本計算機(jī)字符,包括阿拉伯?dāng)?shù)字、英文大小寫字母,部分特殊字符如:!@#$%^&*()-+=;’,.等;GBK字符集包含所有的中文字及所有的ASCII字符;UTF-8字符集包含所有的中文字符,各類小語種的特殊字符及所有的ASCII字符。這些字符集中,所有ASCII字符(半角英文字母及半角標(biāo)點(diǎn)符號)的編碼方式相同,但漢字及ê、、?等特殊字符的編碼方式有區(qū)別。為了更清晰地說明編碼方式引起的字節(jié)信息差異,本文結(jié)合以下代碼段進(jìn)行分析:
System.out.println(“UTF-8:”+ byteArray2BinaryString(“中”.getBytes(“utf8”)));
System.out.println(“GBK:”+ byteArray2BinaryString(“中”.getBytes(“gbk”)));
這段代碼實(shí)現(xiàn)的是對于漢字“中”分別進(jìn)行UTF-8和GBK編碼。
運(yùn)行結(jié)果如下:
UTF-8: 11100100 10111000 10101101
GBK: 11010110 11010000
運(yùn)行結(jié)果顯示,“中”這個字在UTF-8編碼方式下,其2進(jìn)制表示為:
11100100 10111000 10101101
而“中”這個字在GBK編碼方式下,其2進(jìn)制表示為:
11010110 11010000
可以看出,同一漢字在2個不同的字符集中,其字節(jié)碼是不一樣的,甚至長度都不一樣。所以,要想讓其它程序識別一段字節(jié)碼所表示字符,首先要明確其使用的是哪一種字符集,如果編碼方與解碼方使用的字符集不同,會出現(xiàn)“亂碼”情況。
若軟件需要兼容法文、西班牙文、葡萄牙文等小語種,則在前端程序中必須使用UTF-8字符集。對于以GBK字符集為基礎(chǔ)的現(xiàn)有軟件,如何在滿足兼容性要求的前提下實(shí)現(xiàn)字符集的轉(zhuǎn)換,是解決軟件增加小語種兼容問題的關(guān)鍵所在。
根據(jù)各類型字符集的范圍可以推斷,雖然UTF-8字符集和GBK字符集存在顯著差異,但是它們的ASCII字符部分的編碼方式一致??梢圆捎孟率龃a段進(jìn)行分析驗(yàn)證:
System.out.println(“UTF-8: ”+ byteArray2BinaryString(“A”.getBytes(“utf8”)));
System.out.println(“GBK: ”+ byteArray2BinaryString(“A”.getBytes(“gbk”)));
這段代碼實(shí)現(xiàn)的是對于英文字符“A”分別進(jìn)行UTF-8和GBK編碼。
運(yùn)行結(jié)果如下:
UTF-8: 1000001
GBK: 1000001
運(yùn)行結(jié)果顯示,“A”這個字符在UTF-8編碼方式和GBK編碼方式下,其2進(jìn)制表示均為:1000001。說明上述2種字符集存在相通部分(ASCII部分),并存在利用其來實(shí)現(xiàn)GBK與UTF-8字符集之間信息交互的可能性。因此,不需要對前后臺所有的程序全部進(jìn)行字符集修改,僅需修改前臺程序的字符集,可實(shí)現(xiàn)既保持軟件兼容性又確保軟件改動最小的目標(biāo)。
要判斷是否僅修改前臺程序的字符集,首先要分析前后臺程序之間有哪些需要交互的文本信息,具體如下:
(1) 監(jiān)控簡報信息,主要包括:開關(guān)量動作信息、模擬量越限信息、順控流程信息、節(jié)點(diǎn)狀態(tài)信息、進(jìn)程狀態(tài)信息、控制操作信息、各類通信程序上報信息等。
(2) 后臺歷史記錄,即監(jiān)控簡報信息中各類信息的歷史記錄。
(3) 各類前后臺都需要加載的配置文件。
在原系統(tǒng)中上述各類信息均采用GBK編碼方式。針對前后臺程序共用的配置文件,可分2種情況來考慮:① 對于無需進(jìn)行國際化內(nèi)容的配置文件,可保留使用GBK字符集,在前臺程序?qū)ζ溥M(jìn)行解析或保存時,依然指定使用GBK字符集即可[1];② 對于含國際化處理的文本信息的配置文件,需改為使用UTF-8字符集,并且通過修改程序邏輯的方式,避免后臺程序直接讀取此類配置文件中的文本內(nèi)容。針對監(jiān)控簡報信息及其歷史記錄,需分類進(jìn)行討論。
最常見的一類為水力發(fā)電廠的開關(guān)量動作信息、模擬量越限信息。此類信息通常為電氣信號,其原理為:外部設(shè)備通過硬接線接入監(jiān)控系統(tǒng)的PLC,PLC模件通過網(wǎng)絡(luò)通信將這些電氣信號上送至上位機(jī),上位機(jī)軟件則根據(jù)信號的順序在模型庫中對測點(diǎn)模型進(jìn)行預(yù)定義,這些測點(diǎn)的描述會存放在監(jiān)控系統(tǒng)的上位機(jī)模型庫中。原有的告警策略為在后臺程序中直接組織好完整的簡報信息之后發(fā)送給前臺進(jìn)行展示。然而實(shí)際上前臺模型庫中本身就存放了測點(diǎn)的描述信息,在后臺直接發(fā)布完整的告警信息的策略確實(shí)略顯粗糙,實(shí)際上只要將測點(diǎn)的ID信息、測值、動作性質(zhì)等數(shù)據(jù)發(fā)布至前臺,前臺可根據(jù)這些信息重新組織出需要展示的簡報[2]。為了避免后臺程序無法解析的小語種特殊字符,采用了后臺程序僅發(fā)布測點(diǎn)ID、動作性質(zhì)、測值等數(shù)據(jù),由前臺程序重新組織出最終告警信息的策略,解決了上位機(jī)網(wǎng)絡(luò)環(huán)境中需要多種語言的系統(tǒng)同時存在的難題。
另一類信息為水力發(fā)電廠監(jiān)控系統(tǒng)中的順控流程信息、節(jié)點(diǎn)狀態(tài)信息、進(jìn)程狀態(tài)信息、控制操作信息、各類通信程序上報信息。此類信息通常為非電量信號,大部分都是通過外部系統(tǒng)通訊上送,或者由后臺程序在系統(tǒng)運(yùn)行過程中,根據(jù)實(shí)際需要動態(tài)生成的告警信息。此類信息的特點(diǎn)是具有不確定性,大部分信息無法在數(shù)據(jù)模型中進(jìn)行預(yù)定義。針對此類信號,原有策略為在后臺程序中直接組織好完整的簡報信息之后發(fā)送給前臺進(jìn)行展示,此類信息不含有其它附加信息。由于此類信息無法通過測點(diǎn)信息進(jìn)行重組,后臺程序不再發(fā)送組織好的完整簡報信息,可改為發(fā)送根據(jù)一套前后臺約定好的策略組織出來的碼值(只使用ASCII字符)。前臺程序收到碼值后,根據(jù)前后臺碼值轉(zhuǎn)換規(guī)約(詳見2.2)以及碼值信息對照表解譯出需要展示的信息。
流程、通訊類信息需要進(jìn)行碼值轉(zhuǎn)換,轉(zhuǎn)換前需要提前獲得以下幾個要素:
(1) 如何確定此類信息是一條進(jìn)行了碼值轉(zhuǎn)換的信息;
(2) 從哪里獲取碼值與文本的對應(yīng)關(guān)系;
(3) 哪些內(nèi)容需要根據(jù)碼值進(jìn)行轉(zhuǎn)換。
明確以上要素,可設(shè)計出對應(yīng)的碼值轉(zhuǎn)換規(guī)約[3],具體方法如下:
在信息的開頭,用<[filename]>的格式,來告知前臺文本信息存放的配置文件,其中filename即文件名。因此,開頭“<[”連續(xù)的兩個字符,可以作為這是一條需要進(jìn)行碼值轉(zhuǎn)換信息的標(biāo)記。
用<#1.1.1.3.5#>的格式,來告知前臺測點(diǎn)ID。例如其中1.1.1.3.5就是一個測點(diǎn)ID,前臺程序可以根據(jù)此ID將之轉(zhuǎn)換為對應(yīng)的測點(diǎn)描述。
用<%2,11%>的格式,來告知前臺具體的碼值信息。例如2和11中的2表示碼值的第一級關(guān)鍵字,11表示碼值的第二級關(guān)鍵字[4]。
如圖1所示,“key”列即為在文章開頭提到過的“key”。
碼值信息對照表的標(biāo)準(zhǔn)格式見圖1,其中第1列為一級關(guān)鍵字,第2列為二級關(guān)鍵字,第3列為保留信息,第4列為文本信息。例如后臺發(fā)送碼值“<[lcu1.info]> LCU1<%2,11%>”至前臺。
前臺收到信息后,開始解析[5]:
“<[lcu1.info]>”表示信息對照配置文件名,其內(nèi)容即為圖1所示;
圖1 碼值信息對照表
“LCU1”為原始字符串,不需要進(jìn)行碼值轉(zhuǎn)換;
“<%2,11%>”為碼值信息,第1級關(guān)鍵字2,第2級關(guān)鍵字11,經(jīng)過解析找到對應(yīng)的信息:“有其他流程在執(zhí)行,流程退出”。
最終完整的信息為:“LCU1有其他流程在執(zhí)行,流程退出”。
系統(tǒng)的前臺程序采用JAVA語言編碼,JAVA默認(rèn)的國際化資源管理方式為properties鍵值對文件,每一個國際化語言,對應(yīng)一個單獨(dú)的資源文件。然而,該模式不便于資源的整體管理。由于資源分散在各個文件中,易出現(xiàn)不同語言的資源文件中的信息數(shù)量不一致,導(dǎo)致出現(xiàn)前臺信息缺失的現(xiàn)象[6]。
因此,新一代水力發(fā)電廠監(jiān)控軟件(SC2000)使用了統(tǒng)一的文件管理模式,所有的資源信息全部放在同一個資源文件中。系統(tǒng)自動根據(jù)預(yù)先的配置,獲取不同列中的信息來進(jìn)行展示[7]:
如圖2所示,“key”列即為在文章開頭提到過的“key”。“cn”列為中文,“en”列為英文,“fr”列為法文,“sp”列為西班牙語,“pt”列為葡萄牙語。上述幾列均為前文提到的“value”,系統(tǒng)根據(jù)配置的不同,選取對應(yīng)列中的“value”進(jìn)行展示[8]。
圖2 國際化資源文件
水電站工程新一代水力發(fā)電廠監(jiān)控軟件(SC2000)已在以下項(xiàng)目中應(yīng)用:
(1) 贊比亞卡里巴水電站(中文、英語),累計安全運(yùn)行超過2 650 d。
(2) 哥斯達(dá)黎加凱奇水電站(西班牙語),累計安全運(yùn)行超過2 200 d。
(3) 越南松針?biāo)娬?中文、英語),累計安全運(yùn)行超過960 d。
(4) 馬里古伊那水電站(法語),累計安全運(yùn)行超過360 d。
(5) 洪都拉斯帕圖卡III水電站(中文、英語、西班牙語),累計安全運(yùn)行超過110 d。
(6) 老撾南公水電站(中文、英語、法語),投運(yùn)中。
在大量國際化項(xiàng)目的應(yīng)用中,SC2000軟件以穩(wěn)定、安全、可靠的性能獲得了用戶的認(rèn)可。在同時使用多種語言的現(xiàn)場環(huán)境中,展現(xiàn)出了自身的優(yōu)勢。南京南瑞水利水電科技有限公司近期承接的水力發(fā)電廠監(jiān)控項(xiàng)目,也全部采用了SC2000軟件。隨著越來越多的國際化項(xiàng)目的出現(xiàn),SC2000軟件將擁有更加廣闊的應(yīng)用空間。