public static Encoding[] DetectInputCodepages(byte[] input, int maxEncodings) { if (maxEncodings < 1) { throw new ArgumentOutOfRangeException("at least one encoding must be returend", "maxEncodings"); } if (input == null) { throw new ArgumentNullException("input"); } if (input.Length == 0) { return(new Encoding[] { Encoding.ASCII }); } if (input.Length < 256) { byte[] newInput = new byte[256]; int steps = 256 / input.Length; for (int i = 0; i < steps; i++) { Array.Copy(input, 0, newInput, input.Length * i, input.Length); } int rest = 256 % input.Length; if (rest > 0) { Array.Copy(input, 0, newInput, steps * input.Length, rest); } input = newInput; } List <Encoding> result = new List <Encoding>(); IMultiLanguage2 multilang2 = new FMultiLanguageClass(); if (multilang2 == null) { throw new System.Runtime.InteropServices.COMException("Failed to get IMultilang2"); } try { SDetectEncodingInfo[] detectedEncdings = new SDetectEncodingInfo[maxEncodings]; int scores = detectedEncdings.Length; int srcLen = input.Length; SMlDetectCp options = SMlDetectCp.MLDETECTCP_NONE; multilang2.DetectInputCodepage(options, 0, ref input[0], ref srcLen, ref detectedEncdings[0], ref scores); if (scores > 0) { for (int i = 0; i < scores; i++) { result.Add(Encoding.GetEncoding((int)detectedEncdings[i].nCodePage)); } } } finally { Marshal.FinalReleaseComObject(multilang2); } return(result.ToArray()); }
public static Encoding[] DetectOutgoingEncodings(string input, int[] preferedEncodings, bool preserveOrder) { if (input == null) { throw new ArgumentNullException("input"); } if (input.Length == 0) { return new Encoding[] { Encoding.ASCII } } ; List <Encoding> result = new List <Encoding>(); IMultiLanguage3 multilang3 = new FMultiLanguageClass(); if (multilang3 == null) { throw new System.Runtime.InteropServices.COMException("Failed to get IMultilang3"); } try { int[] resultCodePages = new int[preferedEncodings.Length]; uint detectedCodepages = (uint)resultCodePages.Length; ushort specialChar = (ushort)'?'; IntPtr pPrefEncs = Marshal.AllocCoTaskMem(sizeof(uint) * preferedEncodings.Length); IntPtr pDetectedEncs = preferedEncodings == null ? IntPtr.Zero : Marshal.AllocCoTaskMem(sizeof(uint) * resultCodePages.Length); try { if (preferedEncodings != null) { Marshal.Copy(preferedEncodings, 0, pPrefEncs, preferedEncodings.Length); } Marshal.Copy(resultCodePages, 0, pDetectedEncs, resultCodePages.Length); SMlCpf options = SMlCpf.MLDETECTF_VALID_NLS | SMlCpf.MLDETECTF_PREFERRED_ONLY; if (preserveOrder) { options |= SMlCpf.MLDETECTF_PRESERVE_ORDER; } if (preferedEncodings != null) { options |= SMlCpf.MLDETECTF_PREFERRED_ONLY; } multilang3.DetectOutboundCodePage(options, input, (uint)input.Length, pPrefEncs, (uint)(preferedEncodings == null ? 0 : preferedEncodings.Length), pDetectedEncs, ref detectedCodepages, ref specialChar); if (detectedCodepages > 0) { int[] theResult = new int[detectedCodepages]; Marshal.Copy(pDetectedEncs, theResult, 0, theResult.Length); for (int i = 0; i < detectedCodepages; i++) { result.Add(Encoding.GetEncoding(theResult[i])); } } } finally { if (pPrefEncs != IntPtr.Zero) { Marshal.FreeCoTaskMem(pPrefEncs); } Marshal.FreeCoTaskMem(pDetectedEncs); } } finally { Marshal.FinalReleaseComObject(multilang3); } return(result.ToArray()); }