请选择 进入手机版 | 继续访问电脑版
楼主: freyabc
972 1

[学习分享] sas不同语言版本下的编码方式 [推广有奖]

  • 0关注
  • 0粉丝

本科生

80%

还不是VIP/贵宾

-

威望
0
论坛币
68 个
通用积分
1.6666
学术水平
15 点
热心指数
17 点
信用等级
14 点
经验
1248 点
帖子
44
精华
0
在线时间
177 小时
注册时间
2022-7-28
最后登录
2024-3-18

freyabc 发表于 2023-3-1 23:20:51 |显示全部楼层 |坛友微信交流群
相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
目前国内普遍会接触到四种语言环境分别是:
中文(简体)、英文、Unicode支持、English with DBCS。
本文将基于中英文切换的角度从三个方面来讲一下他们的不同之处。

一、界面语言
中文(简体)版本下的界面语言是中文,其他三个版本的界面语言采用英文。

二、编码方式
在不同版本运行下列语句,可获得当前版本的编码方式。
  1. %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可以针对变量进行转码,用法如下:
  1. 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
(这篇文章讲的非常详细,包含大量的示例程序帮助理解,值得一读)
The Impact of Change from wlatin1 to UTF-8 in SAS Environment.pdf (159.35 KB, 需要: 1 个论坛币)
3.sashelp帮助文档
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝


已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
dxystata + 100 + 1 精彩帖子
whymath + 60 + 36 + 3 + 3 + 3 精彩帖子

总评分: 经验 + 160  论坛币 + 36  学术水平 + 3  热心指数 + 4  信用等级 + 3   查看全部评分

冰落O樱 发表于 2023-3-2 10:50:07 |显示全部楼层 |坛友微信交流群
感谢分享

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-3-28 19:41