当前,我们在SAS会话服务器上使用WLATIN1 (Windows 1252) encoding
(并且似乎没有即将转移到UTF-8
的信息)。
我有一个EXCEL文件(它是从互联网数据库导出的文件),它以UTF-8
编码,并且在{{中包含一个不受支持的Wiki refernce的特殊字符≥
) 1}}。我知道我可以使用WLATIN1 encoding
之类的不同编码读取EXCEL数据,但UTF-8
仍会打印ODS
而不是=
。
我想匹配一些包含此特殊字符的字符串,但是SAS当然不允许我本机使用此字符。有什么办法可以避免这种情况?
MWE:我们假设EXCEL文件包含一个变量≥
和一个观察值a
:
a = 'this is a test ≥'
可以通过任何方式解决此问题吗?我尝试使用data encoding;
set excel;
if a ='this is a test ≥' then
put 'it works';
else
put 'it does not work';
run;
而不是'(*ESC*){unicode "2265"x}'
,但无法正常工作。与往常一样,非常感谢您的帮助/想法!
编辑:
我们正在运行≥
。
当前,EXCEL文件的读取是通过使用SAS Release 9.4 TS1M5
完成的:
PROC IMPORT
答案 0 :(得分:2)
如果您在SAS服务器环境中,则需要使用Unicode支持启动设置来设置服务器。
在桌面环境中,可以从SAS开始菜单中的Icon下方的Unicode支持启动会话。命令行是:
"C:\Program Files\SASHome\SASFoundation\9.4\sas.exe"
-CONFIG "C:\Program Files\SASHome\SASFoundation\9.4\nls\u8\sasv9.cfg"
nls\u8\
配置文件将包含一些行,这些行的编码设置只能在会话启动时应用,以及指向支持utf8会话的SAS dll的路径。
…
-SET SASCFG "C:\Program Files\SASHome\SASFoundation\9.4\nls\u8"
-DBCS
-LOCALE en_US
-ENCODING UTF-8
…
在Unicode会话中,以下示例代码的日志将显示≥和=之间的区别,并且ODS将输出≥。在默认的SBCS会话中,即使代码编辑器显示≥,相同的代码也被映射为=。
“日志”窗口的字体应设置为Consolas
或其他支持UTF-8的字体。
data have;
input; a = _infile_; datalines;
this is a test ≥
run;
data want;
set have;
c1 = '≥';
c2 = '=';
put "NOTE: " (c:) (=);
r1 = rank(c1);
r2 = rank(c2);
put "NOTE: " (r:) (=);
if a = 'this is a test ≥'
then put "NOTE: " a 'it works';
else put "NOTE: " a 'it does not work';
run;
proc print data=want;
run;
--------------------
NOTE: c1== c2==
NOTE: r1=226 r2=61
NOTE: this is a test = it works
默认(SBCS)会话中的同一代码显示≥将被转码为=
NOTE: c1== c2==
NOTE: r1=61 r2=61
NOTE: this is a test = it works
增强型编辑器在所有情况下都可能支持UTF-8,但是(我推测)在运行提交时将其转码为会话编码。