- 问题:如何截取ECGTPT变量中的后三个字符?
下图展示了以k开头的以及非k开头的substr函数和length函数,发现在UTF-8编码下,仅以k开头的函数能够截取成功。
- 释疑(以下内容来自SAS Help)
SAS提供的字符函数和call例程可以很轻松地处理字符型数据。很多原始的SAS字符函数假定每个字符都是1个字节,这些函数可以很好地处理单字节字符集(single-byte character set SBCS)。
但是当处理双字节字符集(double-byte character set DBCS)或UTF-8这样的多字节字符集(multi-byte character set MBCS)时,这些函数和call例程很可能返回错误的结果。
为了解决这类问题,SAS引入了K函数。为了准确使用K函数,需要理解基于字节(byte-based)的偏移量和基于字符(character-based)的偏移量(offset-length)。
基于字节的偏移量假定字符的起始位置是字符串中字节的起始位置。对SBCS数据,一个字符的长度总是1个字节的长度,字符串中的第二个字符就在第2个字节处开始。由于数据和数据的编码方式不同,对多字节数据来说,第2个字节的数据,有以下几种情况:
- 字符中的第二个字符;
- 双字节字符的第2个字节;
- 字符串中第一个字符的第一个字节。
基于字节的偏移量是字符串中字节的数量,基于字符的偏移量是字符串中字符所在的位置。K函数使用基于字符的偏移量。
因此,不管对于length或者是substr来说,例子中使用了k函数的才能够把每一个汉字当成一个字符处理。
那么,是否所有的字符型函数都有对应的k函数呢?这就要讲到另一个概念:I18N(internationalization)。根据函数是否能处理DBCS、MBCS或SBCS,确定了I18N的三个级别:
-
I18N 0级
仅用于处理SBCS数据; -
I18N 1级
如果需要处理MBCS数据,尽量避免使用这类函数。因为在特定情境下,I18N 1级的函数无法准确处理DBMS或者MBCS数据; -
I18N 2级
可处理SBCS、DBCS和MBCS(UTF-8)数据。
下面展示几个常用的字符型函数,最左边为0级,中间为1级,右边为2级。
可以看到,substr为I18N 0级。ksubstr和klength为I18N 2级。
- 疑问
但是!!length怎么也是I18N 2级?但是code显示length和klength的处理结果明显不一样呢!