Программируем конвертер для преобразования текста в разные кодовые страницы // © Rabusov Online Service. 2004 // Рабусов С.В.
Живые и Твёрдые Издательский Дом Коммерсантъ
Аудиокниги // AudioBooks

Конвертирование (преобразование) текста из одной кодовой страницы в другую

Логика работы представленной программы проста. Она читает текст из стандарного входа и записывает преобразованный текст в стандартный выход. По умолчанию предполагается, что входной текст представляет собой набор символов из исходной кодовой страницы (source CodePage = 1251, это страница Windows cyrillic), а текст на выходе представляет собой набор символов из целевой кодовой страницы (target CodePage = 866, это страница DOS)
Для того, чтобы конвертировать тексты из файлов, пользуемся перенаправлением ввода/вывода.
Для перекодирования текста из файла c:\text1251.txt и записи преобразованного текста в файл c:\text866.txt надо выполнить следующую команду:
 
    CPConverter < c:\text1251.txt > c:\text866.txt
 
 
Для перекодирования из кодовой страницы 866 в кодовую страницу 1251 вызов будет таким:
 
    CPConverter -s866 -t1251 < c:\text866.txt > c:\text1251.txt
 
 
Кодовые страницы можно задавать через опции командной строки:
  • -s866 ... задаёт номер исходной (source) кодовой страницы равным 866
  • -t1251 ... задаёт номер целевой (target) кодовой страницы равным 1251

Архив с программой cpConverter.zip (3kb)

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace win2dos

{

    class Program

    {

        // Converter from one codepage to another codepage

        static void Main(string[] args)

        {

            string unicodeStr;

            int target_CodePage = 866;

            int source_codePage = 1251;

            Boolean run = true;

            foreach (string s in args)

            {

                if (s.Length > 2)

                {

                    if (s.Substring(0, 2).ToLower() == "-s")

                    {

                        try

                        {

                            source_codePage = Convert.ToInt16(s.Substring(2));

                        }

                        catch { }

                    }

                    if (s.Substring(0, 2).ToLower() == "-t")

                    {

                        try

                        {

                           target_CodePage = Convert.ToInt16(s.Substring(2));

                        }

                        catch { }

                    }

                }

                if (s.Substring(0, 2).ToLower() == "-h")

                {

                    System.Console.WriteLine("Rabusov, 10 jul 2013");

                    System.Console.WriteLine("Converter from one codepage to another codepage");

                    System.Console.WriteLine("usage:");

                    System.Console.WriteLine("{0} -sCODEPAGENUMBER -tCODEPAGENUMBER < FileNameSource > FileNameTarget", Environment.GetCommandLineArgs()[0]);

                    System.Console.WriteLine("where:\n\tFileNameSource - file with content of source codepage");

                    System.Console.WriteLine("\tFileNameWin - file with content of target codepage");

                    System.Console.WriteLine("\t-s and -t are optional");

                    System.Console.WriteLine("Defaulf source codepage is 1251\nDefault target codepage is 866");

                    System.Console.WriteLine("Current source codepage is {0}\nCurrent target codepage is {1}", source_codePage, target_CodePage);

                    System.Console.WriteLine("Ctrl-C to break running...");

                    run = false;

                }

            }

            Encoding target = System.Text.Encoding.GetEncoding(target_CodePage);

            Encoding source = System.Text.Encoding.GetEncoding(source_codePage);

            byte[] res;

            char[] asc;

            if (run) {

                if (source_codePage == target_CodePage)

                {

                    System.Console.WriteLine("Sorry. But source codepage and target codepage are equal.\nNothing to convert.");

                    run = false;

                }

            }

            if (run) do

                {

                    unicodeStr = System.Console.ReadLine();

                    if (unicodeStr != null)

                    {

                        // получаем байты оригинала строки

                        res = target.GetBytes(unicodeStr);

                        asc = source.GetChars(res);

                        foreach (char ch in asc)

                        {

                            System.Console.Write(ch);

                        }

                    }

                    System.Console.WriteLine();

                } while (unicodeStr != null);

        }

    }

}

Рейтинг@Mail.ru Фотограф Фотограф Рабусов С.В. ссср