APP下载

水力发电厂监控系统小语种软件国际化策略

2021-05-19鲍艳香

西北水电 2021年2期
关键词:编码方式前台字符

孙 毅 ,鲍艳香

(1.南京南瑞水利水电科技有限公司,南京 210003;2.水利部水文仪器及岩土工程仪器质量监督检验测试中心,南京 210012)

0 前 言

随着这些年中国水力发电厂监控技术的日趋成熟,越来越多的国外水力发电厂项目开始使用国内水力发电厂监控产品。与2000—2010年已实施过的部分国外项目不同,新的需求不再仅是单一的英文版软件,法文、西班牙文、葡萄牙文等其他语言版本软件需求也逐渐出现。为了满足小语种国际化项目的需求,南京南瑞水利水电科技有限公司开发了新一代国际化水力发电厂监控软件产品(SC2000)。早期的水力发电厂监控软件因为只需要支持中文及英文,使用了“GBK”字符集,该字符集可支持所有的简体中文、繁体中文、英文等字符,但无法兼容某些小语种中的一些特殊字符,如:ê、、Ö等等。实际上,在现在的软件开发中,更为广泛使用的是“UTF-8”字符集,这一字符集可以兼容几乎所有的字符,包括小语种中的各种特殊字符。因此,如果需要兼容各种小语种,还需将软件使用的字符集更改为“UTF-8”字符集。然而,传统的软件前后台采用了不同的编程语言,前台为JAVA语言,后台为C语言,两者之间的各类信息传输都使用了“GBK”字符集作为编码模式,如果仅修改其中某一方的编码方式,会造成前后台字符集的不兼容,导致软件出现大量乱码。并且原来的软件中,大量配置文件也使用了“GBK”编码,直接对软件编码方式进行修改,会造成无法兼容以前的项目,对后续的维护工作造成严重的影响,需进行软件版本的分支。

1 软件国际化及字符集

1.1 何为软件国际化

软件国际化最终需要实现的目标是:在不对软件进行重新编码或者替换运行文件的基础上,可以通过只修改一个运行参数,或者直接在界面上选择的方式,切换软件界面上显示的语言。一般实现目标的策略:在软件中所有需要出现文本显示的地方,都避免在软件中采用硬编码,通过键值对查找策略来实现,即在代码中需要显示文本的地方,通过某一个“key”,去找出资源文件中对应的“value”,最终把“value”显示出来。“key”是固化在软件源代码中,而获取 “value”可以根据配置不同,去获取资源文件中不同的语言文字。

总体来说,软件国际化是一套成熟的软件所必备的体系,对软件的可维护性、可扩展性都有极大的帮助,比如避免在需要修改软件语言时,需要去对软件进行重写编码。

1.2 字符集

字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。而字符集是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集有ASCII字符集、GBK字符集、UTF-8字符集、UTF-16字符集、ISO-8859-1字符集。在列出的5种字符集中,除ASCII字符集外,其余均支持简体汉字。计算机要准确的处理各种字符集文字,就需要进行字符编码,以便计算机识别和存储各种文字。其中,ASCII字符集包含所有的基本计算机字符,包括阿拉伯数字、英文大小写字母,部分特殊字符如:!@#$%^&*()-+=;’,.等;GBK字符集包含所有的中文字及所有的ASCII字符;UTF-8字符集包含所有的中文字符,各类小语种的特殊字符及所有的ASCII字符。这些字符集中,所有ASCII字符(半角英文字母及半角标点符号)的编码方式相同,但汉字及ê、、Ö等特殊字符的编码方式有区别。为了更清晰地说明编码方式引起的字节信息差异,本文结合以下代码段进行分析:

System.out.println(“UTF-8:”+ byteArray2BinaryString(“中”.getBytes(“utf8”)));

System.out.println(“GBK:”+ byteArray2BinaryString(“中”.getBytes(“gbk”)));

这段代码实现的是对于汉字“中”分别进行UTF-8和GBK编码。

运行结果如下:

UTF-8: 11100100 10111000 10101101

GBK: 11010110 11010000

运行结果显示,“中”这个字在UTF-8编码方式下,其2进制表示为:

11100100 10111000 10101101

而“中”这个字在GBK编码方式下,其2进制表示为:

11010110 11010000

可以看出,同一汉字在2个不同的字符集中,其字节码是不一样的,甚至长度都不一样。所以,要想让其它程序识别一段字节码所表示字符,首先要明确其使用的是哪一种字符集,如果编码方与解码方使用的字符集不同,会出现“乱码”情况。

若软件需要兼容法文、西班牙文、葡萄牙文等小语种,则在前端程序中必须使用UTF-8字符集。对于以GBK字符集为基础的现有软件,如何在满足兼容性要求的前提下实现字符集的转换,是解决软件增加小语种兼容问题的关键所在。

1.3 UTF-8与GBK的交集

根据各类型字符集的范围可以推断,虽然UTF-8字符集和GBK字符集存在显著差异,但是它们的ASCII字符部分的编码方式一致。可以采用下述代码段进行分析验证:

System.out.println(“UTF-8: ”+ byteArray2BinaryString(“A”.getBytes(“utf8”)));

System.out.println(“GBK: ”+ byteArray2BinaryString(“A”.getBytes(“gbk”)));

这段代码实现的是对于英文字符“A”分别进行UTF-8和GBK编码。

运行结果如下:

UTF-8: 1000001

GBK: 1000001

运行结果显示,“A”这个字符在UTF-8编码方式和GBK编码方式下,其2进制表示均为:1000001。说明上述2种字符集存在相通部分(ASCII部分),并存在利用其来实现GBK与UTF-8字符集之间信息交互的可能性。因此,不需要对前后台所有的程序全部进行字符集修改,仅需修改前台程序的字符集,可实现既保持软件兼容性又确保软件改动最小的目标。

2 兼容策略

2.1 策略分析

要判断是否仅修改前台程序的字符集,首先要分析前后台程序之间有哪些需要交互的文本信息,具体如下:

(1) 监控简报信息,主要包括:开关量动作信息、模拟量越限信息、顺控流程信息、节点状态信息、进程状态信息、控制操作信息、各类通信程序上报信息等。

(2) 后台历史记录,即监控简报信息中各类信息的历史记录。

(3) 各类前后台都需要加载的配置文件。

在原系统中上述各类信息均采用GBK编码方式。针对前后台程序共用的配置文件,可分2种情况来考虑:① 对于无需进行国际化内容的配置文件,可保留使用GBK字符集,在前台程序对其进行解析或保存时,依然指定使用GBK字符集即可[1];② 对于含国际化处理的文本信息的配置文件,需改为使用UTF-8字符集,并且通过修改程序逻辑的方式,避免后台程序直接读取此类配置文件中的文本内容。针对监控简报信息及其历史记录,需分类进行讨论。

最常见的一类为水力发电厂的开关量动作信息、模拟量越限信息。此类信息通常为电气信号,其原理为:外部设备通过硬接线接入监控系统的PLC,PLC模件通过网络通信将这些电气信号上送至上位机,上位机软件则根据信号的顺序在模型库中对测点模型进行预定义,这些测点的描述会存放在监控系统的上位机模型库中。原有的告警策略为在后台程序中直接组织好完整的简报信息之后发送给前台进行展示。然而实际上前台模型库中本身就存放了测点的描述信息,在后台直接发布完整的告警信息的策略确实略显粗糙,实际上只要将测点的ID信息、测值、动作性质等数据发布至前台,前台可根据这些信息重新组织出需要展示的简报[2]。为了避免后台程序无法解析的小语种特殊字符,采用了后台程序仅发布测点ID、动作性质、测值等数据,由前台程序重新组织出最终告警信息的策略,解决了上位机网络环境中需要多种语言的系统同时存在的难题。

另一类信息为水力发电厂监控系统中的顺控流程信息、节点状态信息、进程状态信息、控制操作信息、各类通信程序上报信息。此类信息通常为非电量信号,大部分都是通过外部系统通讯上送,或者由后台程序在系统运行过程中,根据实际需要动态生成的告警信息。此类信息的特点是具有不确定性,大部分信息无法在数据模型中进行预定义。针对此类信号,原有策略为在后台程序中直接组织好完整的简报信息之后发送给前台进行展示,此类信息不含有其它附加信息。由于此类信息无法通过测点信息进行重组,后台程序不再发送组织好的完整简报信息,可改为发送根据一套前后台约定好的策略组织出来的码值(只使用ASCII字符)。前台程序收到码值后,根据前后台码值转换规约(详见2.2)以及码值信息对照表解译出需要展示的信息。

2.2 前后台码值转换规约

流程、通讯类信息需要进行码值转换,转换前需要提前获得以下几个要素:

(1) 如何确定此类信息是一条进行了码值转换的信息;

(2) 从哪里获取码值与文本的对应关系;

(3) 哪些内容需要根据码值进行转换。

明确以上要素,可设计出对应的码值转换规约[3],具体方法如下:

在信息的开头,用<[filename]>的格式,来告知前台文本信息存放的配置文件,其中filename即文件名。因此,开头“<[”连续的两个字符,可以作为这是一条需要进行码值转换信息的标记。

用<#1.1.1.3.5#>的格式,来告知前台测点ID。例如其中1.1.1.3.5就是一个测点ID,前台程序可以根据此ID将之转换为对应的测点描述。

用<%2,11%>的格式,来告知前台具体的码值信息。例如2和11中的2表示码值的第一级关键字,11表示码值的第二级关键字[4]。

如图1所示,“key”列即为在文章开头提到过的“key”。

码值信息对照表的标准格式见图1,其中第1列为一级关键字,第2列为二级关键字,第3列为保留信息,第4列为文本信息。例如后台发送码值“<[lcu1.info]> LCU1<%2,11%>”至前台。

前台收到信息后,开始解析[5]:

“<[lcu1.info]>”表示信息对照配置文件名,其内容即为图1所示;

图1 码值信息对照表

“LCU1”为原始字符串,不需要进行码值转换;

“<%2,11%>”为码值信息,第1级关键字2,第2级关键字11,经过解析找到对应的信息:“有其他流程在执行,流程退出”。

最终完整的信息为:“LCU1有其他流程在执行,流程退出”。

3 国际化资源管理策略

系统的前台程序采用JAVA语言编码,JAVA默认的国际化资源管理方式为properties键值对文件,每一个国际化语言,对应一个单独的资源文件。然而,该模式不便于资源的整体管理。由于资源分散在各个文件中,易出现不同语言的资源文件中的信息数量不一致,导致出现前台信息缺失的现象[6]。

因此,新一代水力发电厂监控软件(SC2000)使用了统一的文件管理模式,所有的资源信息全部放在同一个资源文件中。系统自动根据预先的配置,获取不同列中的信息来进行展示[7]:

如图2所示,“key”列即为在文章开头提到过的“key”。“cn”列为中文,“en”列为英文,“fr”列为法文,“sp”列为西班牙语,“pt”列为葡萄牙语。上述几列均为前文提到的“value”,系统根据配置的不同,选取对应列中的“value”进行展示[8]。

图2 国际化资源文件

4 应 用

水电站工程新一代水力发电厂监控软件(SC2000)已在以下项目中应用:

(1) 赞比亚卡里巴水电站(中文、英语),累计安全运行超过2 650 d。

(2) 哥斯达黎加凯奇水电站(西班牙语),累计安全运行超过2 200 d。

(3) 越南松针水电站(中文、英语),累计安全运行超过960 d。

(4) 马里古伊那水电站(法语),累计安全运行超过360 d。

(5) 洪都拉斯帕图卡III水电站(中文、英语、西班牙语),累计安全运行超过110 d。

(6) 老挝南公水电站(中文、英语、法语),投运中。

在大量国际化项目的应用中,SC2000软件以稳定、安全、可靠的性能获得了用户的认可。在同时使用多种语言的现场环境中,展现出了自身的优势。南京南瑞水利水电科技有限公司近期承接的水力发电厂监控项目,也全部采用了SC2000软件。随着越来越多的国际化项目的出现,SC2000软件将拥有更加广阔的应用空间。

猜你喜欢

编码方式前台字符
字符代表几
一种USB接口字符液晶控制器设计
图片轻松变身ASCⅡ艺术画
HBM电子称与西门子S7-200系列PLC自由口通讯
庞鲜、周衍耀室内设计作品
公路电助力 从幕后走向前台
孟晚舟:从前台打杂到华为副总裁
GCOA算法
可穿戴式多通道传感系统功能需求分析及设计
混合编码方式自适应差分进化算法优化设计宽带天线