我們經(jīng)常會(huì)看到Klength,Ksubstr,以及Kscan等一系列的函數(shù),由此會(huì)產(chǎn)生疑惑,加K和不加K兩者之間有什么區(qū)別和聯(lián)系。當(dāng)我們在做項(xiàng)目的時(shí)候發(fā)現(xiàn)有時(shí)候不加K也能實(shí)現(xiàn)我們想要得到的結(jié)果,但是有時(shí)候則會(huì)出現(xiàn)亂碼的情況,嘗試加上K后就可以完美規(guī)避掉亂碼這個(gè)問題,為什么會(huì)出現(xiàn)這樣的問題呢?本文告訴你答案。
原來加K是以字符為基礎(chǔ)進(jìn)行處理,也就是你數(shù)字符串中有幾個(gè)字符就是幾個(gè)字符,而不加K是以字節(jié)為基礎(chǔ)進(jìn)行處理。我們知道在SAS中文簡體中一個(gè)漢字(標(biāo)點(diǎn))占兩個(gè)字節(jié),一個(gè)數(shù)字占一個(gè)字節(jié);在SAS UTF-8中一個(gè)漢字(標(biāo)點(diǎn))占三個(gè)字節(jié),數(shù)字占一個(gè)字節(jié),但是SAS 英文版字符和數(shù)字都占一個(gè)字節(jié),所以在此環(huán)境下Klength和Length、Substr和Ksubstr的功能是一樣的,下面我舉三個(gè)例子,以UTF-8為例:
一、klength和length
例1:計(jì)算test數(shù)據(jù)集中topic這個(gè)字符變量的長度
data test;
input topic $20.;
cards;
話題Topic 1
話題Topic 2
話題Topic 3
話題Topic 4
話題Topic 5
;
run;
data all1;
set test;
topic1=klength(topic);
topic2=length(topic);
run;
結(jié)果如下:
可以看到,由于中文字符在utf-8編碼時(shí)為3個(gè)字節(jié), 而length函數(shù)計(jì)算的是字節(jié)長度,會(huì)把一個(gè)漢字當(dāng)成3個(gè)長度,數(shù)字當(dāng)做1個(gè)長度,所以計(jì)算結(jié)果為2*3+7=13。而klength函數(shù)會(huì)忽略全角半角,統(tǒng)一把漢字和數(shù)字都當(dāng)做1個(gè)長度,所以計(jì)算結(jié)果為9。
二、ksubstr和substr
例2:提取test數(shù)據(jù)集中topic中前六位的值
data all2;
set test;
topic1=substr(topic,1,6);
topic2=ksubstr(topic,1,6);
run;
結(jié)果如下:
可以看到,substr提取出的字符串為“話題”, 而ksubstr提取出了前六個(gè)字符”話題Topi”,所以還是和上面的例子是一個(gè)道理,以K開頭的是以字符為基礎(chǔ)提取字符串,而不以K開頭的以字節(jié)為基礎(chǔ)提取,但是有時(shí)我們會(huì)遇到用substr提取出的字符串出現(xiàn)亂碼的情況,出現(xiàn)這種情況后要怎樣解決呢,看下面一個(gè)例子。
三、substr和ksubstrb
例3:提取test數(shù)據(jù)集中topic中前5位的字符串
data all3;
set test;
topic1=substr(topic,1,5);
topic2=ksubstr(topic,1,5);
topic3=ksubstrb(topic,1,5);
run;
結(jié)果如下:
可以看到,用substr提取出的字符串出現(xiàn)了亂碼,這是因?yàn)閟ubstr函數(shù)提取字符時(shí)是按字節(jié)來提取的,中文字符在utf-8編碼時(shí)為3個(gè)字節(jié),所以提取指定長度的字符串時(shí)如果截?cái)嗔藵h字,那么返回的結(jié)果顯示出來便會(huì)出現(xiàn)亂碼。此時(shí)用ksubstrb函數(shù)就可以避免出現(xiàn)亂碼的情況,它會(huì)舍棄最后一個(gè)不完整字符,從而保證不會(huì)出現(xiàn)顯示上的亂碼。
-
字符串
+關(guān)注
關(guān)注
1文章
579瀏覽量
20529 -
SAS
+關(guān)注
關(guān)注
2文章
523瀏覽量
32884 -
UTF-8
+關(guān)注
關(guān)注
0文章
13瀏覽量
7861
發(fā)布評論請先 登錄
相關(guān)推薦
評論