如何在WLATIN1编码的SAS会话中使用UTF-8编码的文件?

时间:2019-03-14 17:11:33

标签: encoding character-encoding sas

当前,我们在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

1 个答案:

答案 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,但是(我推测)在运行提交时将其转码为会话编码。