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)
実際の結果、切り取りの最後に文字化けが発生します.最後の文字は複数バイトで、不完全なカットがされたからです.
改善後の方法は以下の通りです.
JavaScriptの中のBlobオブジェクトはバイト長:var len= new Blob(''文字列').size;
JSコードは比較的簡潔ですか?
転載先:https://www.cnblogs.com/xiongzaiqiren/p/9020731.html
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