我們經常會看到Klength,Ksubstr,以及Kscan等一系列的函數,由此會產生疑惑,加K和不加K兩者之間有什么區別和聯系。當我們在做項目的時候發現有時候不加K也能實現我們想要得到的結果,但是有時候則會出現亂碼的情況,嘗試加上K后就可以完美規避掉亂碼這個問題,為什么會出現這樣的問題呢?本文告訴你答案。
原來加K是以字符為基礎進行處理,也就是你數字符串中有幾個字符就是幾個字符,而不加K是以字節為基礎進行處理。我們知道在SAS中文簡體中一個漢字(標點)占兩個字節,一個數字占一個字節;在SAS UTF-8中一個漢字(標點)占三個字節,數字占一個字節,但是SAS 英文版字符和數字都占一個字節,所以在此環境下Klength和Length、Substr和Ksubstr的功能是一樣的,下面我舉三個例子,以UTF-8為例:
一、klength和length
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;
結果如下:
可以看到,由于中文字符在utf-8編碼時為3個字節, 而length函數計算的是字節長度,會把一個漢字當成3個長度,數字當做1個長度,所以計算結果為2*3+7=13。而klength函數會忽略全角半角,統一把漢字和數字都當做1個長度,所以計算結果為9。
二、ksubstr和substr
例2:提取test數據集中topic中前六位的值
data all2;
set test;
topic1=substr(topic,1,6);
topic2=ksubstr(topic,1,6);
run;
結果如下:
可以看到,substr提取出的字符串為“話題”, 而ksubstr提取出了前六個字符”話題Topi”,所以還是和上面的例子是一個道理,以K開頭的是以字符為基礎提取字符串,而不以K開頭的以字節為基礎提取,但是有時我們會遇到用substr提取出的字符串出現亂碼的情況,出現這種情況后要怎樣解決呢,看下面一個例子。
三、substr和ksubstrb
例3:提取test數據集中topic中前5位的字符串
data all3;
set test;
topic1=substr(topic,1,5);
topic2=ksubstr(topic,1,5);
topic3=ksubstrb(topic,1,5);
run;
結果如下:
可以看到,用substr提取出的字符串出現了亂碼,這是因為substr函數提取字符時是按字節來提取的,中文字符在utf-8編碼時為3個字節,所以提取指定長度的字符串時如果截斷了漢字,那么返回的結果顯示出來便會出現亂碼。此時用ksubstrb函數就可以避免出現亂碼的情況,它會舍棄最后一個不完整字符,從而保證不會出現顯示上的亂碼。
-
字符串
+關注
關注
1文章
566瀏覽量
20384 -
SAS
+關注
關注
2文章
517瀏覽量
32770 -
UTF-8
+關注
關注
0文章
13瀏覽量
7830
發布評論請先 登錄
相關推薦
評論