截取UTF-8編碼的漢字,最後一個字出現亂碼的問題

問題描述html

原來字串內容name爲下面內容:數組

######name=楊乃文作DJ,微信公衆號FunRadio。什麼樣的姿態是小丑姿態?2016046######微信

 

須要截取成大小爲64的name_rm[64]的數組內容,出現以下亂碼:編碼

######name=楊乃文作DJ,微信公衆號FunRadio。什麼樣的姿態#####spa

 

問題分析.net

UTF-8編碼,漢字佔3個字節,英文佔一個字節,標點符號佔領3個字節。code

漢子:15*3=45
英文:10*1=10
標點符號:2*3=6
 
共61,64-61=3還可存放一個漢字。因爲程序將最後一個字節設置爲結尾符‘\0’,致使只剩截取須要三個字節存放的漢字,從而出現亂碼。
 
問題解決
若是隻能存放有效長度63(除掉結束符)的內容,
則從原來字串裏面讀取長度爲63的內容裏面的有效字符串。
 
上面按例有效字串長度爲61,這樣從原來字串提取61的長度,就不會出現亂碼了。
 
提取有效字串長度代碼:
 1 int getsubstringlen(char *string,int len)
 2 {
 3 
 4     int j = 0;
 5     int n = 0;
 6     char *p = NULL;
 7 
 8     int str_length = len;
 9     
10     p = string;    
11 
12     while(n <= str_length)
13     {
14 
15         if((*p & 0XFC)==0XFC)
16         {
17             j = 6;    
18         }
19         else if((*p & 0XF8)==0XF8)
20         {    
21             j = 5;        
22         }
23         else if((*p & 0XF0)==0XF0)
24         {
25             j = 4;
26         }
27         else if((*p & 0XE0)==0XE0)
28         {
29             j = 3;
30         }
31         else if((*p & 0XC0)==0XC0)
32         {
33             j = 2;
34         }
35         else
36         {
37             j = 1;
38         }
39 
40         if (n+j<=str_length)
41         {
42             n += j;
43         }else
44             break;
45         
46         p = p+j;        
47     }
48 
49     return n;
50 
51 } 

 

參考資料:
http://blog.csdn.net/chary8088/article/details/21226375
 

UTF-8的編碼規則很簡單, 只有兩條:

1) 對於單字節的符號, 字節的第一位設爲0, 後面7位爲這個符號的unicode碼. 所以對於
   英語字母, UTF-8編碼和ASCII碼是相同的.

2) 對於n字節的符號(n>1), 第一個字節的前n位都設爲1, 第n+1位設爲0, 後面字節的前
   兩位一概設爲10. 剩下的沒有說起的二進制位, 所有爲這個符號的unicode碼.

下表總結了編碼規則, 字母x表示可用編碼的位.xml

 1 <SPAN xmlns="http://www.w3.org/1999/xhtml">// #txt---  
 2    |  Unicode符號範圍      |  UTF-8編碼方式  
 3  n |  (十六進制)           | (二進制)  
 4 ---+-----------------------+------------------------------------------------------  
 5  1 | 0000 0000 - 0000 007F |                                              0xxxxxxx  
 6  2 | 0000 0080 - 0000 07FF |                                     110xxxxx 10xxxxxx  
 7  3 | 0000 0800 - 0000 FFFF |                            1110xxxx 10xxxxxx 10xxxxxx  
 8  4 | 0001 0000 - 0010 FFFF |                   11110xxx 10xxxxxx 10xxxxxx 10xxxxxx  
 9  5 | 0020 0000 - 03FF FFFF |          111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx  
10  6 | 0400 0000 - 7FFF FFFF | 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx  
11   
12                     表 1. UTF-8的編碼規則  
13 // #txt---end  
14 </SPAN>  
相關文章
相關標籤/搜索