国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C# > 正文

C#(.net)中按字節(jié)數(shù)截取字符串最后出現(xiàn)亂碼問題的解決

2019-10-29 19:59:04
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

前言

最近需要用到按字節(jié)數(shù)截取字符串。在網(wǎng)上找了很多方法。

Encoding.Default.GetString采用的Default

Encoding.UTF8.GetBytes采用的是utf-8編碼。這樣當(dāng)然是亂碼。尤其出現(xiàn)中文時(shí)候。

對(duì)這類數(shù)據(jù)處理當(dāng)然要用統(tǒng)一的編碼來(lái)處理。下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧

例子:1

 string msg= Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(strcode)); 

例子:2

string strcode="我是小明";byte[] buffer=Encoding.UTF8.GetBytes(strcode);string msg= Encoding.UTF8.GetString(buffer,0,buffer.Length);

實(shí)際結(jié)果是截取的結(jié)尾會(huì)出現(xiàn)亂碼。原因是最后的字符是多個(gè)字節(jié),被不完整的截取了。

改進(jìn)后的辦法如下:

/// <summary> /// 按字節(jié)數(shù)截取字符串的方法(比SubString好用) /// </summary> /// <param name="source">要截取的字符串(可空)</param> /// <param name="NumberOfBytes">要截取的字節(jié)數(shù)</param> /// <param name="encoding">System.Text.Encoding</param> /// <param name="suffix">結(jié)果字符串的后綴(超出部分顯示為該后綴)</param> /// <returns></returns> public static string SubStringByBytes(string source, int NumberOfBytes, System.Text.Encoding encoding, string suffix = "...") {  if(string.IsNullOrWhiteSpace(source) || source.Length == 0)  return source;  if(encoding.GetBytes(source).Length <= NumberOfBytes)  return source;  long tempLen = 0;  StringBuilder sb = new StringBuilder();  foreach(var c in source)  {  Char[] _charArr = new Char[] { c };  byte[] _charBytes = encoding.GetBytes(_charArr);  if((tempLen + _charBytes.Length) > NumberOfBytes)  {   if(!string.IsNullOrWhiteSpace(suffix))   sb.Append(suffix);   break;  }  else  {   tempLen += _charBytes.Length;   sb.Append(encoding.GetString(_charBytes));  }  }  return sb.ToString(); } /// <summary> /// 按字節(jié)數(shù)截取字符串的方法(比SubString好用) /// </summary> /// <param name="source">要截取的字符串(可空)</param> /// <param name="NumberOfBytes">要截取的字節(jié)數(shù)</param> /// <param name="encoding">UTF-8,Unicode,GB2312...</param> /// <param name="suffix">結(jié)果字符串的后綴(超出部分顯示為該后綴)</param> /// <returns></returns> public static string SubStringByBytes(string source, int NumberOfBytes, string encoding = "UTF-8", string suffix = "...") {  return SubStringByBytes(source, NumberOfBytes, Encoding.GetEncoding(encoding), suffix); }

原理很簡(jiǎn)單,就是截取之前逐個(gè)先判斷字符是否超出字節(jié)長(zhǎng)度,如果超出則扔掉整個(gè)字符。

在JavaScript里面的Blob對(duì)象很容易獲取字節(jié)長(zhǎng)度: var len= new Blob(['字符串']).size;

JS代碼是不是比較簡(jiǎn)潔?

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)VEVB武林網(wǎng)的支持。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到c#教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 阿合奇县| 高平市| 芮城县| 法库县| 尖扎县| 桐梓县| 灵璧县| 米易县| 锦屏县| 福海县| 义马市| 保山市| 大埔县| 蒙阴县| 都昌县| 吉安市| 昌邑市| 方山县| 中宁县| 淮南市| 徐闻县| 连江县| 武胜县| 雷州市| 镶黄旗| 庆云县| 衡东县| 文昌市| 南宫市| 天等县| 杭州市| 兴化市| 松溪县| 石楼县| 炎陵县| 平利县| 塘沽区| 安庆市| 扬中市| 治县。| 正镶白旗|