Конвертировать из ANSI в кодировку UTF-8 - PullRequest
0 голосов
/ 02 мая 2018

У меня есть веб-приложение ASP.Net 4.0, написанное на C #, и одна из его функций - записать файл в файловую систему на основе данных, извлеченных из запроса SQL Server 2012. Иногда пользовательский ввод содержит символы французского языка, часто вырезанные и вставленные из Microsoft Word и, следовательно, в кодировке ANSI. Этот файл, который создает мое веб-приложение, затем загружается в другую программу с помощью кода, находящегося вне моего контроля, т.е. не в моем веб-приложении. Проблема в том, что эта вторая программа требует кодировки UTF-8. Я написал код для преобразования вывода моей программы в UTF-8, но он все еще загружается неправильно, поэтому я думаю, что я делаю что-то не так. Вот мой код:

protected void writeToClientFile(DataSet ClientGenl, DataSet ClientBus, DataSet ClientBill)
    {
        FileStream fileStream = null;
        string fileName = "ClientTest.txt";
        string pathName = ConfigurationSettings.AppSettings["EliteFilePath"].ToString();
        try
        {
            using (new KLClassLibrary.Impersonator(proxyaccount, domain, password))
            {
                fileStream = OpenASAP(pathName + fileName, 10);
                using (TextWriter tw = new StreamWriter(fileStream))
                {
                    foreach (DataRow rowGeneral in ClientGenl.Tables[0].Rows)
                    {
                        string fileTextGeneral = "CLNUM:" + rowGeneral["clnum"].ToString().toEliteInput();
                        byte[] originalBytes = Encoding.Default.GetBytes(fileTextGeneral);
                        byte[] convertedBytes = Encoding.Convert(Encoding.Default, Encoding.UTF8, originalBytes);
                        char[] convertedChars = new char[Encoding.UTF8.GetCharCount(convertedBytes, 0, convertedBytes.Length)];
                        Encoding.UTF8.GetChars(convertedBytes, 0, convertedBytes.Length, convertedChars, 0);
                        string convertedString = new string(convertedChars);
                        tw.WriteLine(convertedString);
                    }
                }
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            if (fileStream != null)
                fileStream.Dispose();
        }
    }
FileStream OpenASAP(string path, int maxTries)
    {
        FileStream fs = null;
        bool lastResult = false;
        int count = 0;
        while ((lastResult == false) && count < maxTries)
        {
            lastResult = TryOpen(path, out fs);
            Thread.Sleep(100);
            count++;
        }
        if (!lastResult || count >= maxTries)
        {
            throw new Exception("The file is being written to");
        }
        return fs;
    }
bool TryOpen(string FileWithPath, out FileStream fs)
    {
        try
        {
            fs = File.Open(FileWithPath, FileMode.Append, FileAccess.Write, FileShare.None);
            return true;
        }
        catch (Exception ex)
        {
            fs = null;
            return false;
        }
    }

1 Ответ

0 голосов
/ 02 мая 2018

Вы можете получить исходную кодировку из StreamReader.CurrentEncoding , а затем преобразовать кодировку, используя Encoding.Convert () , указав производную кодировку в качестве исходной кодировки и Encoding.UTF8 в качестве кодировки назначения.

Таким образом, вы позволяете StreamReader решать, какая кодировка соответствует содержимому исходного файла.
Вероятно, это будет Unicode (UTF16 в Windows), преобразованный из кодировки по умолчанию.

string TextDestinaton = string.Empty;

using (FileStream FileOrigin = new FileStream(@"[SomeSourceFile]", 
                                   FileMode.Open, FileAccess.Read, FileShare.None))
using (StreamReader orgReader = new StreamReader(FileOrigin))
{
    Encoding OriginalEncoding = Encoding.GetEncoding(orgReader.CurrentEncoding.CodePage);
    byte[] OriginalBytes = OriginalEncoding.GetBytes(orgReader.ReadToEnd());
    byte[] DestinationBytes = Encoding.Convert(OriginalEncoding, Encoding.UTF8, OriginalBytes, 0, OriginalBytes.Length);

    using (MemoryStream memstream = new MemoryStream(DestinationBytes, 0, DestinationBytes.Length))
    using (StreamReader destReader = new StreamReader(memstream, Encoding.UTF8))
    {
        memstream.Position = 0;
        TextDestinaton = destReader.ReadToEnd();
    };
}

В качестве примечания: если исходный текст содержал символы, которые не соответствовали локальной кодировке (когда текст был получен), и не использовалась специальная кодировка для сохранения исходного сопоставления кодовой страницы, исходный текст мог быть скомпрометирован.

...