utf8字符串截取

utf8字符串是變長字符串,在日常處理時字符串截取時,如果處理不好則會出現亂碼,針對這個問題下面給出一個通用utf8字符串截取的示例,下面給出的是用pythonphp實現根據原理可以用任何語言來實現.
 

  1. # python  
  2. # utf8 substr  
  3. def safestrlength_utf8(sourcestr): # {{{  
  4.     i = 0;  
  5.     n = 0;  
  6.     str_length = len(sourcestr);  
  7.  
  8.     while i < str_length:  
  9.         temp_str = sourcestr[i:i+1]  
  10.         ascnum = ord(temp_str)  
  11.         if ascnum >= 252:  
  12.             i = i + 6   
  13.         elif ascnum >= 248:  
  14.             i = i + 5   
  15.         elif ascnum >= 240:  
  16.             i = i + 4   
  17.         elif ascnum >= 224:  
  18.             i = i + 3   
  19.         elif ascnum >= 192:  
  20.             i = i + 2   
  21.         elif ascnum >= 65 and ascnum <= 90:   
  22.             i = i + 1   
  23.         else:  
  24.             i = i + 1   
  25.        n = n + 1   
  26.    n = n - 1   
  27.    return n  
  28.  
  29. # utf8 string length  
  30. def safesubstr_utf8(sourcestr, cutlength):  
  31.     returnlist = []  
  32.     i = 0   
  33.     n = 0   
  34.     str_length = len(sourcestr)  
  35.  
  36.     while (n < cutlength) and (i <= str_length):  
  37.         temp_str = sourcestr[i:i+1]  
  38.         ascnum = ord(temp_str)  
  39.         if ascnum >= 252:  
  40.             returnlist.append(sourcestr[i:i+6])  
  41.             i = i + 6   
  42.         elif ascnum >= 248:  
  43.             returnlist.append(sourcestr[i:i+5])  
  44.             i = i + 5   
  45.         elif ascnum >= 240:  
  46.             returnlist.append(sourcestr[i:i+4])  
  47.             i = i + 4   
  48.         elif ascnum >= 224:  
  49.             returnlist.append(sourcestr[i:i+3])  
  50.             i = i + 3   
  51.         elif ascnum >= 192:  
  52.             returnlist.append(sourcestr[i:i+2])  
  53.             i = i + 2   
  54.        elif ascnum >= 65 and ascnum <= 90:   
  55.             returnlist.append(sourcestr[i:i+1])  
  56.             i = i + 1   
  57.        else:  
  58.             returnlist.append(sourcestr[i:i+1])  
  59.             i = i + 1 
  60.        n = n + 1;  
  61.     return "".join(returnlist) 

 

  1. // php  
  2. // substr for utf8 string, then utf8 word is 1 length  
  3. public static function safesubstr_utf8($sourcestr$cutlength// {{{  
  4. {   
  5.     $returnstr = '';  
  6.     $i = 0;  
  7.     $n = 0;  
  8.     $str_length = strlen($sourcestr);  
  9.  
  10.     while(($n < $cutlength) && ($i <= $str_length))  
  11.     {   
  12.         $temp_str = substr($sourcestr$i, 1);  
  13.         $ascnum = Ord($temp_str);  
  14.         if($ascnum >= 252)  
  15.         {  
  16.             $returnstr = $returnstr.substr($sourcestr$i, 6);  
  17.             $i = $i + 6;  
  18.         }   
  19.         elseif($ascnum >= 248)  
  20.         {  
  21.             $returnstr = $returnstr.substr($sourcestr$i, 5);  
  22.             $i = $i + 5;  
  23.         }   
  24.         elseif($ascnum >= 240)  
  25.         {   
  26.             $returnstr = $returnstr.substr($sourcestr$i, 4);  
  27.             $i = $i + 4;  
  28.         }   
  29.         elseif($ascnum >= 224)  
  30.         {  
  31.             $returnstr = $returnstr.substr($sourcestr$i, 3);  
  32.             $i = $i + 3;  
  33.         }  
  34.         elseif($ascnum >= 192)  
  35.         {  
  36.             $returnstr = $returnstr.substr($sourcestr$i, 2);  
  37.             $i = $i + 2;  
  38.         }  
  39.         elseif($ascnum >= 65 && $ascnum <= 90)  
  40.         {  
  41.             $returnstr = $returnstr.substr($sourcestr$i, 1);  
  42.             $i = $i + 1;  
  43.         }  
  44.         else 
  45.         {  
  46.             $returnstr = $returnstr.substr($sourcestr$i, 1);  
  47.             $i = $i + 1;  
  48.         }  
  49.         $n++;  
  50.     }  
  51.  
  52.     return $returnstr;  
  53. // }}}  
  54.  
  55. // get length for utf8 string, then utf8 word is 1 length  
  56. public static function safestrlength_utf8($sourcestr// {{{  
  57. {  
  58.     $i = 0;  
  59.     $n = 0;  
  60.     $str_length = strlen($sourcestr);  
  61.  
  62.     while($i <= $str_length)  
  63.     {  
  64.         $temp_str = substr($sourcestr$i, 1);  
  65.         $ascnum = Ord($temp_str);  
  66.         if($ascnum >= 252)  
  67.         {  
  68.             $i = $i + 6;  
  69.         }  
  70.         elseif($ascnum >= 248)  
  71.         {  
  72.             $i = $i + 5;  
  73.         }  
  74.         elseif($ascnum >= 240)  
  75.         {  
  76.             $i = $i + 4;  
  77.         }  
  78.         elseif($ascnum >= 224)  
  79.         {  
  80.             $i = $i + 3;  
  81.         }  
  82.         elseif($ascnum >= 192)  
  83.         {  
  84.             $i = $i + 2;  
  85.         }  
  86.         elseif($ascnum >= 65 && $ascnum <= 90)  
  87.         {  
  88.             $i = $i + 1;  
  89.         }  
  90.         else 
  91.         {  
  92.             $i = $i + 1;  
  93.         }  
  94.         $n++;  
  95.     }  
  96.     $n--;  
  97.     return $n;  
  98. // }}}  

U-00000000 - U:

0xxxxxxx

U-00000080 - U-000007FF:

110xxxxx 10xxxxxx

U-00000800 - U-0000FFFF:

1110xxxx 10xxxxxx 10xxxxxx

U-00010000 - U-001FFFFF:

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

U-00200000 - U-03FFFFFF:

111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

U-04000000 - U-7FFFFFFF:

1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章