CDISC中国协调委员会

找回密码
立即注册
发新帖

收听

听众

主题
发表于 2016-8-16 10:37:16 | 查看: 4518| 回复: 1
本帖最后由 John 于 2016-8-28 17:17 编辑

Pinnacle Community中文支持
Sam Chen @Tigermed, John Wang @dMed@C3C
2016-08-12


Pinnacle 21公司的Pinnacle 21 Community软件[1]是业内进行CDISC的ComplianceCheck合规检查的常用软件。虽然它检查出来的结果有很多不符合CDISC官方定义的规则,但是一来它是免费的工具,二来它的商业版Pinnacle21 Enterprise连FDA都在用相同的内核的Datafit,其它的替代工具还没有超越它。

Pinnacle Community对中文的支持很不友好。数据集标签,变量标签,变量值,一旦这些内容中含有中文字符,在最终的报告的详细页(Details)中必然会出现乱码。

我们需要从4个方面来改进它的中文支持:
1) 更改配置文件,加入一行UTF-8编码支持,这样读取XPT数据集的变量标签和变量值时不会出错;
2) 替换掉validator-core库,正确读取XPT数据集的标签和变量值;
3) 使用中文版本的Metadata元数据,中文的数据集的标签和变量标签;
4) 使用中文版本的受控术语,核心常用的受控术语的中文版本。


1)更改配置文件:
用记事本或其它文本编辑器打开文件\components\lib\properties\settings.properties,如图1,加入以下加粗的一行:
Engine.ThreadCount = 1
Engine.InputBufferSize = 8
Engine.SasFileEncoding = UTF-8




图1修改settings.properties



2)替换validator-core库:
将附件中的文件validator-core-2.1.3.jar,复制到目录\components\lib中,替换掉原来的JAR文件,如图2。

图2替换validator-core.jar


3)使用中文版本的Metadata元数据:
将附件中的文件SDTM3.2 (CN).xml,复制到目录\components\config中,如图3。使用时,在Validator界面中,选取Configuration的下拉列表时,选中SDTM3.2 (CN)即可。如下图4所示。


图3添加SDTM3.2 (CN)至config目录




图4Validator主界面


4)使用中文版本的受控术语:
在目录\components\config\data\CDISC\SDTM下,新建一个目录,比如2016-06-30,将附件中的文件SDTMTerminology.odm.xml复制到此目录下,如图5。使用时,在Validator界面中,选取CDISCCT的下拉列表时,选中2016-06-30即可。如上图4所示。
图5添加SDTM受控术语




后记
在修改1)和2)时,Sam查看了PinnacleCommunity的原始代码库[2]。并对读取数据集标签和变量值的部分的代码,进行了修改和重新编译,打包到了validator-core-2.1.3.jar。原始代码库的代码比发布的PinnacleCommunity的版本要旧,对解决中文乱码问题造成了一定的障碍,但经过不断修改调试,最终完美地解决了问题。打上这个补丁之后,PinnacleCommunity的大中华地区用户将不再有中文乱码问题的困扰。
Sam愿意借这个机会跟大家分享一下这个中文乱码问题的解决思路和过程。
我们先从一个最简单的例子入手,给你一个字节数组 [65, 66, 67],请问这表示什么文字?可能有人一眼就能看出来,这是“ABC”,没错,用GBK、ISO-8859-1、UTF-8这三种字符编码得到的都是“ABC”,之所以没有乱码,是因为这三种字符集都包含ABC。
但是如果给你的字节数组是这样的:[-28, -67, -96, -27, -91, -67],有人认识这是什么文字吗?
我们分别用3种字符集来试试看


原来只有UTF-8跟[-28,-67, -96, -27, -91, -67]最配啊。
现在我们知道乱码出现的原因了,是因为字节数组和字符集搭配错误造成的。有的情况下,“搭配错误”造成的乱码是中间产物,并不一定最终会造成乱码,比如这个例子:


但这种情况往往是很容易出错的,string和byte[] 用不同的字符集转来转去,会弄得人晕头转向。最佳实践是,整个过程中始终使用同一个正确的字符集,这里关键字是两个:“同一个”、“正确”。这个字符集,最好选择UTF-8
现在回到我们的PinnacleCommunity的乱码问题上来。阅读源代码有如下发现:
1.      构造String时,有的地方用的字符集是Settings.get("Engine.SasFileEncoding","ISO-8859-1")
2.      构造String时,有的地方没有指定字符集,那么就会使用JVM平台默认的字符集,这个一般跟用户的计算机环境有关系,中文操作系统可能是GBK,英文操作系统可能是ISO-8859-1…
3.      获取字节数组都是直接调用getBytes()方法,未指定字符集,那么也是JVM平台默认的字符集。
4.      SAS的含有中文的xpt文件,使用的是UTF-8

根据这4点,结合我们上面总结的“最佳实践”,我们只有把字符集统一成UTF-8才能避免中文乱码问题。
除了要修改settings.properties(上文已经讲过,不再赘述),还要想办法把JVM默认字符集设置为UTF-8, 这个又有两种做法:设置JVM启动参数(非侵入性),或者注入几行代码(侵入性)。没有找到它调用java命令的地方,大概是封在dll里面了,只好用注入代码的方式了,我找的注入点在SourceProvider.java中。

希望未来有我们国内的软件厂商能够推出自己的做合规检查的软件,造福国内的新药递交。











本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

发表于 2016-8-16 11:00:18
上文中的附件。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

回复 显示全部楼层 道具 举报

您需要登录后才可以回帖 登录 | 立即注册

添加常用链接|关于我们|小黑屋|手机版|CDISC中国协调委员会 ( 沪ICP备08020480号

GMT+8, 2018-10-17 19:46 , Processed in 0.257337 second(s), 21 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表