C(.net)でバイト数で文字列を切り取り、最後に文字化けが発生した問題を解決します.

6606 ワード

最近はバイト数で文字列を切り取る必要があります.インターネットで多くの方法を探しました.
Enccoding.Default.GetStringで採用されているDefault Enccoding.UTF 8 GetByttesは、utf-8符号化を採用しています.これはもちろん文字化けです.特に中国語が出た時.このようなデータ処理はもちろん統一コードで処理します.
例:1 string msg=Encocding.UTF 8 GetString(Encocding.UTF 8 GetByttes)例:2 string stracode=「私は小明です.」byte[]buffer=Enccoding.UTF 8 GetByttes;string msg=Enccoding.UTF 8 GetString(buffer,0,buffer.Length)
 
実際の結果、切り取りの最後に文字化けが発生します.最後の文字は複数バイトで、不完全なカットがされたからです.
改善後の方法は以下の通りです. /// /// ( SubString ) /// /// ( ) /// /// System.Text.Encoding /// ( ) /// 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(); } /// /// ( SubString ) /// /// ( ) /// /// UTF-8,Unicode,GB2312... /// ( ) /// public static string SubStringByBytes(string source, int NumberOfBytes, string encoding = "UTF-8", string suffix = "...") { return SubStringByBytes(source, NumberOfBytes, Encoding.GetEncoding(encoding), suffix); }原理は簡単です.切り取る前に、文字がバイトの長さを超えているかどうかを一つずつ判断し、それを超えると文字全体を捨てます.
JavaScriptの中のBlobオブジェクトはバイト長:var len= new Blob(''文字列').size;
JSコードは比較的簡潔ですか?
 
転載先:https://www.cnblogs.com/xiongzaiqiren/p/9020731.html