中文(简体)、英文、Unicode支持、English with DBCS。
本文将基于中英文切换的角度从三个方面来讲一下他们的不同之处。
一、界面语言
中文(简体)版本下的界面语言是中文,其他三个版本的界面语言采用英文。
二、编码方式
在不同版本运行下列语句,可获得当前版本的编码方式。
- %put &sysencoding;
英文的编码方式为wlatin1,该编码中的w取值western的首字母,顾名思义为西方世界使用,不考虑亚洲字符。wlatin1向下兼容ASCII,也可以简单理解为ASCII。一个字节表示一个字符。
中文和English with DBCS的编码方式为euc-cn,也就是常说的GB2312。 使用两个字节来表示一个字符,也就是DBCS(double-byte character set)。
Unicode的编码方式为utf-8。在UTF-8编码中:一个中文等于三个字节,中文标点占三个字节。一个英文字符等于一个字节,英文标点占一个字节。
三、兼容性
兼容性就是不同版本之间的转换。首先下个结论,utf-8>euc-cn>wlatin1。
原理如下:
a.不同编码涵盖的字符量:utf-8>euc-cn>wlatin1。这表明,从utf8往下转码时。只有在字符适用时才成功。
b.不同编码多字节字符占据的字节数量:utf-8(3 bytes)>euc-cn(2 bytes)>wlatin1(1 byte)。这表明,从wlatin1往上转码时,只有在变量长度在新编码下足够时,才成功。
对于详细的应用会按照不同的文件操作进行解释。
1..sas文件(.sas)
打开不同版本下,正常录入code(中英均可)。保存sas文件时默认以当前语言环境下的编码方式保存,也可选择其他编码方式保存。
英文版本下,默认以wlatin1保存sas文件,可选wlatin1、euc-cn、utf-8、utf-16(LE)、utf-16(BE);
中文和English with DBCS默认以euc-cn保存sas文件,可选euc-cn、utf-8、utf-16(LE)、utf-16(BE);
Unicode默认以utf-8保存sas文件,可选euc-cn、utf-8、utf-16(LE)、utf-16(BE)。
应使用相应版本打开相应code。如使用unicode打开euc-cn编码的文件会出现字符乱码情况。在unicode环境下打的代码可以用另存为euc-cn的方式来保存供euc-cn环境下打开。
注意英文环境下默认用wlatin1保存的sas文件,代码或注释中如果出现中文,再次使用英文版本打开依然会出现乱码。
2.数据集(.sas7bdat)
默认输出数据集也就是不同版本对应的编码方式。
但数据集的编码方式不会随着更新数据集而变化,比方我在wlatin1中保存一个数据集,但是我在utf-8的环境里更新了该数据集,数据集的编码方式并不会因此而默认更改为utf-8,而是依然保持wlatin1的编码方式。
在utf-8中可以正确打开euc-cn和wlatin1数据集,因为sas打开数据集会自动进行转码处理。但在wlatin1中可能无法正确打开utf-8和euc-cn数据集,也就是上面提到的兼容性排序。
3.导入外部文件(.sas、.txt、.csv等)
在导入外部文件时,文件需要与编码环境的编码方式相同,如不同则会出现乱码。可以采用更改原文件编码的方式打开文件,或采用encoding=的选项来决定读入和导入的编码方式。
总结:
1.中文和English with DBCS在编码方式无任何区别,使用同一种编码方式,只是使用了不同的界面语言,其他没有区别,可以根据自己的英文能力选择语言版本(英文版本的报错更容易在网上搜寻到相关解答的信息)。
2.英文版本只适用全英的数据集和数据集,不推荐使用。
3.Unicode版本兼容性最好,可以处理来自任何可能语言的字符。但日常编码环境仅涉及到中文和英文的情况下,仁者见仁智者见智。
附:与编码方式相关的一些函数或选项
1.对变量的操作:DBCS字符串函数--K函数
K函数主要针对多字节字符,比方说length(“我”)在utf8中等于3,在euc-cn中等于2。但klength(“我”)在两个环境中均为1。诸如此类的函数还有KLEFT, KRIGHT, KLOWCASE, KUPCASE, KREVERSE, KSCAN, KSTRIP, KSUBSTR, KTRANSLATE等。
其中KCVT可以针对变量进行转码,用法如下:
- outstring = KVCT (instring, encoding_in, encoding_out);
2.对数据集或文件级的操作:encoding=" " 选项
encoding 可以对逻辑库libname,文件filename ,数据集data,和file、infile语句搭配使用。
比方可以先用encoding=“euc-cn” 来file文件,再使用encoding=“utf-8”来infile同一文件达到转码目的。
具体使用方法可见sashelp。
以上观点可能有偏颇或不正确的地方,欢迎大家指正。
参考资料:
1.https://zhuanlan.zhihu.com/p/609608890、https://zhuanlan.zhihu.com/p/609626292
2.The Impact of Change from wlatin1 to UTF-8 in SAS Envioronment
(这篇文章讲的非常详细,包含大量的示例程序帮助理解,值得一读)
3.sashelp帮助文档