我试图在两个不同的iSeries服务器中生成XML。两个服务器都有相同的CCSID。但是,当XML被构架时,"@"字符将转换为其他角色。在另一台服务器中,它显示正确。这两个服务器都处于相同的PTF级别,甚至两个服务器的Java版本都相同。服务器之间有什么区别?我该如何检查差异?为什么'@'转换为其他字符,也只有一台服务器?
这听起来像是CCSID问题。
tl; dr
CCSID存储在IBM I上的多个位置,并取决于数据的来源,您可以有许多检查位置。
系统值 -QCCSID
是系统默认的CCSID,但它仅在某些情况下发挥作用,因此它们应该是相同的,但不是整个故事。请注意,许多大约很长时间的系统将QCCSID设置为65535。
作业CCSID - 每个作业都有自己的CCSID,默认为系统CCSID,但可以通过用户配置文件或SBMJOB
命令进行修改。但这不是CCSID工作中的整个故事。如果CCSID为65535,则基于LANGID
设置了作业默认CCSID。对于我的系统LANGID
是ENU,作业默认CCSID为37。
数据库 - 每个数据库表都指定了CCSID。对于DDS,在CRTPF
命令中指定的SQL中指定了作业默认CCSID。另外,每个字符数据列都可以指定其自己的CCSID。
设备文件 - 像数据库文件一样,设备文件可以在文件级别和字段级别指定自己的CCSID。
问题在于@
字符不是不变字符集的一部分,因此在不同的CCSID中可以不同地显示它,尤其是如果您在混音中具有CCSID 65535。65535意味着不转换。您需要确保CCSID全面相同,如果在那里65535,则它们都彼此一致。
CCSID 65535上的最终说明。从系统上只有单个语言的日子开始,这是一个保留。当时,与非转换字符集有关的问题没有问题,因为使用该系统的每个人都使用相同的语言。如今,随着系统连接的各种方式,与PC和Web共享的数据也很重要,因为即使系统上的每个人都说相同的语言,您仍然可以遇到多个CCSID,因为PC,IFS,ifs XML XML,Unicode等。最好将您的系统CCSID设置为65535以外的东西。