問題描述html
原來字串內容name爲下面內容:數組
######name=楊乃文作DJ,微信公衆號FunRadio。什麼樣的姿態是小丑姿態?2016046######微信
須要截取成大小爲64的name_rm[64]的數組內容,出現以下亂碼:編碼
######name=楊乃文作DJ,微信公衆號FunRadio。什麼樣的姿態斣#####spa
問題分析.net
UTF-8編碼,漢字佔3個字節,英文佔一個字節,標點符號佔領3個字節。code
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 }
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>