Exemple #1
0
        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());
        }
Exemple #2
0
        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());
        }