国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 缙云县| 礼泉县| 桐城市| 郓城县| 会同县| 临桂县| 马鞍山市| 灵石县| 乌兰察布市| 嫩江县| 黔西| 沿河| 亳州市| 美姑县| 蛟河市| 珠海市| 甘孜| 石景山区| 彭山县| 桑日县| 门头沟区| 绥滨县| 忻城县| 修水县| 祁东县| 肥东县| 宜春市| 广安市| 松潘县| 太白县| 德令哈市| 集安市| 恭城| 托里县| 东乡族自治县| 昭觉县| 满洲里市| 永胜县| 杭锦旗| 祁阳县| 乐陵市|