internal static string BytesToText(byte[] buff, Encoding encoding) { if (buff.Length == 0) { return(""); } TextEncodingDetect detect = new TextEncodingDetect(); encoding = detect.GetEncoding(buff, encoding); if (detect.hasBom) { if (encoding == Encoding.UTF8) { return(encoding.GetString(buff, 3, buff.Length - 3)); } if (encoding == Encoding.Unicode || encoding == Encoding.BigEndianUnicode) { return(encoding.GetString(buff, 2, buff.Length - 2)); } if (encoding == Encoding.UTF32) { return(encoding.GetString(buff, 4, buff.Length - 4)); } } return(encoding.GetString(buff)); }
internal static bool Save(string fileName, string text, bool isAppend, bool writeLogOnError, Encoding encode) { try { //System.Text.Encoding.UTF8 string folder = Path.GetDirectoryName(fileName); if (!Directory.Exists(folder)) { Directory.CreateDirectory(folder); } string key = "IOHelper_Save_" + fileName.GetHashCode(); if (cache.Contains(key)) { encode = cache.Get <Encoding>(key); } else if (File.Exists(fileName)) { TextEncodingDetect detect = new TextEncodingDetect(); Encoding detectEncode = detect.GetEncoding(File.ReadAllBytes(fileName), encode); if (detectEncode != Encoding.ASCII) { encode = detectEncode; } cache.Set(key, encode, 60); } lock (GetLockObj(fileName.Length)) { using (StreamWriter writer = new StreamWriter(fileName, isAppend, encode)) { writer.Write(text); } } return(true); } catch (Exception err) { if (writeLogOnError) { Log.WriteLogToTxt(err); } else { Error.Throw("IOHelper.Save() : " + err.Message); } } return(false); }
internal static bool Save(string fileName, string text, bool isAppend, bool writeLogOnError, Encoding encode, int tryCount) { try { //System.Text.Encoding.UTF8 string folder = Path.GetDirectoryName(fileName); if (!Directory.Exists(folder)) { Directory.CreateDirectory(folder); } string key = "IOHelper_Save_" + fileName.GetHashCode(); if (cache.Contains(key)) { encode = cache.Get <Encoding>(key); } else if (File.Exists(fileName)) { TextEncodingDetect detect = new TextEncodingDetect(); Encoding detectEncode = detect.GetEncoding(File.ReadAllBytes(fileName), encode); if (detectEncode != Encoding.ASCII) { encode = detectEncode; } cache.Set(key, encode, 60); } lock (GetLockObj(fileName.Length)) { try { using (StreamWriter writer = new StreamWriter(fileName, isAppend, encode)) { if (!isAppend && fileName.EndsWith(".txt")) { //写入bom头 } writer.Write(text); } } catch (Exception err) { if (tryCount > 0) { tryCount--; Thread.Sleep(500 + (3 - tryCount) * 500); Save(fileName, text, isAppend, writeLogOnError, encode, tryCount); } else { Error.Throw(err.Message); } } } return(true); } catch (Exception err) { if (tryCount == 3) // 避免死循环。 { if (writeLogOnError) { Log.Write(err, LogType.Error); } else { Error.Throw("IOHelper.Save() : " + err.Message); } } } return(false); }
public static string BytesToText(byte[] buff, Encoding encoding) { if (buff.Length == 0) { return(""); } //if (buff[0] == 239 && buff[1] == 187 && buff[2] == 191) //{ // return Encoding.UTF8.GetString(buff, 3, buff.Length - 3); //} //else if (buff[0] == 255 && buff[1] == 254) //{ // return Encoding.Unicode.GetString(buff, 2, buff.Length - 2); //} //else if (buff[0] == 254 && buff[1] == 255) //{ // if (buff.Length > 3 && buff[2] == 0 && buff[3] == 0) // { // return Encoding.UTF32.GetString(buff, 4, buff.Length - 4); // } // return Encoding.BigEndianUnicode.GetString(buff, 2, buff.Length - 2); //} //else //{ TextEncodingDetect detect = new TextEncodingDetect(); //检测Bom switch (detect.DetectWithBom(buff)) { case TextEncodingDetect.Encoding.Utf8Bom: return(Encoding.UTF8.GetString(buff, 3, buff.Length - 3)); case TextEncodingDetect.Encoding.UnicodeBom: return(Encoding.Unicode.GetString(buff, 2, buff.Length - 2)); case TextEncodingDetect.Encoding.BigEndianUnicodeBom: return(Encoding.BigEndianUnicode.GetString(buff, 2, buff.Length - 2)); case TextEncodingDetect.Encoding.Utf32Bom: return(Encoding.UTF32.GetString(buff, 4, buff.Length - 4)); } if (encoding != DefaultEncoding && encoding != Encoding.ASCII)//自定义设置编码,优先处理。 { return(encoding.GetString(buff)); } switch (detect.DetectWithoutBom(buff, buff.Length > 1000 ? 1000 : buff.Length))//自动检测。 { case TextEncodingDetect.Encoding.Utf8Nobom: return(Encoding.UTF8.GetString(buff)); case TextEncodingDetect.Encoding.UnicodeNoBom: return(Encoding.Unicode.GetString(buff)); case TextEncodingDetect.Encoding.BigEndianUnicodeNoBom: return(Encoding.BigEndianUnicode.GetString(buff)); case TextEncodingDetect.Encoding.Utf32NoBom: return(Encoding.UTF32.GetString(buff)); case TextEncodingDetect.Encoding.Ansi: if (IsChineseEncoding(DefaultEncoding) && !IsChineseEncoding(encoding)) { if (detect.IsChinese) { return(Encoding.GetEncoding("gbk").GetString(buff)); } else //非中文时,默认选一个。 { return(Encoding.Unicode.GetString(buff)); } } else { return(encoding.GetString(buff)); } case TextEncodingDetect.Encoding.Ascii: return(Encoding.ASCII.GetString(buff)); default: return(encoding.GetString(buff)); } // } }