Как изменить кодировку xml файла с utf 8 на windows 1251

http://x-romix.narod.ru/UTF8_1251.rar (скачивать ЛЕВОЙ кнопкой мыши, 24К)
Программа позволяет перекодировать текстовые файлы из кодировки UTF-8 в кодировку Windows-1251, а также добавлять маркер UTF-8, если его нет. Автор статьи: romix | Редакторы:
Последняя редакция №3 от 03.07.07 | История
URL: http://kb.mista.ru/article.php?id=481

Ключевые слова: кодировка, utf-8, windows-1251, windows

http://x-romix.narod.ru/UTF8_1251.rar

(скачивать ЛЕВОЙ кнопкой мыши, 24К)

Пример вызова:

utf8_1251.exe test_utf8.xml test.xml

Программа изменяет объявление кодировки в первой строке XML.

Перекодирование из Windows-1251 в UTF-8

Перекодирует XML-файл из кодировки Windows-1251 в UTF8.

Если файл уже в кодировке UTF8, то он остается как есть.

Если файл не содержит маркера кодировки UTF8, то добавляет его.

Вызов win1251_utf8.exe Файл1.xml Файл2.xml

Добавление маркера в UTF-8

Используйте ту же самую программу win1251_utf8.exe для добавления маркера UTF-8.

Если кодировка уже была UTF-8, и был маркер, то файл не изменится.


smaharbA пишет:

9 — 28.02.07 — 21:52

//*******************************************
 
Процедура Сформировать()
    Стрим = СоздатьОбъект("Adodb.Stream");
    Стрим.Type = 2;
    Стрим.Mode= 3;
    Стрим.charset="utf-16";
    //Стрим.charset="windows-1251";
 
    Стрим.Open();
    Стрим.WriteText("Проверочка");
    Стрим.SaveToFile("c:unicode.txt",2);
    Стрим.Close();
    Стрим.charset="koi8-r";
    Стрим.Open();
    Стрим.WriteText("Проверочка");
    Стрим.Close();
    Стрим.charset="utf-8";
    Стрим.Open();
    Стрим.WriteText("Проверочка");
    Стрим.SaveToFile("c:utf-8.txt",2);
    Стрим.Close();
КонецПроцедуры

Кодировка текста – это схема нумерации символов, в которой каждому символу, цифре или знаку присвоено соответствующее число. Кодировку используют для сохранения и обработки текста на компьютере. Каждый раз при сохранении текста в файл он сохраняется с использованием определенной схемы кодирования, и при открытии этого файла необходимо использовать такую же схему, иначе восстановить исходный текст не получится. Самыми популярными кодировками для кириллицы сейчас являются UTF-8, Windows-1251 (CP1251, ANSI).

Для того чтобы программа смогла правильно открыть текстовый файл, иногда приходится вручную менять кодировку, перекодируя текст из одной схемы в другую. Например, не редко возникают проблемы с открытием файлов CSV, XML, SQL, TXT, PHP.

В этой небольшой статье мы расскажем о том, как изменить кодировку текстового файла на UTF-8, Windows-1251 или любую другую.

Блокнот Windows

Если вы используете операционную систему Windows 10 или Windows 11, то вы можете изменить кодировку текста с помощью стандартной программы Блокнот. Для этого нужно открыть текстовый файл с помощью Блокнота и воспользоваться меню «Файл – Сохранить как».

меню Файл – Сохранить как

В открывшемся окне нужно указать новое название для файла, выбрать подходящую кодировку и нажать на кнопку «Сохранить».

изменить кодировку в Блокноте

К сожалению, для подобных задач программа Блокнот часто не подходит. С ее помощью нельзя открывать документы большого размера, и она не поддерживает многие кодировки. Например, с помощью Блокнота нельзя открыть текстовые файлы в DOS 866.

Notepad++

Notepad++ (скачать) является одним из наиболее продвинутых текстовых редакторов. Он обладает подсветкой синтаксиса языков программирования, позволяет выполнять поиск и замену по регулярным выражениям, отслеживать изменения в файлах, записывать и воспроизводить макросы, считать хеш-сумы и многое другое. Одной из основных функций Notepad++ является поддержка большого количества кодировок текста и возможность изменения кодировки текстового файла в UTF-8 или Windows 1251.

Для того чтобы изменить кодировку текста с помощью Notepad++ файл нужно открыть в данной программе. Если программа не смогла правильно определить схему кодирования текста, то это можно сделать вручную. Для этого нужно открыть меню «Кодировки – Кириллица» и выбрать нужный вариант.

выбрать кодировку в Notepad++

После открытия текста можно изменить его кодировку. Для этого нужно открыть меню «Кодировки» и выбрать один из вариантов преобразования. Notepad++ позволяет изменить текущую кодировку текста на ANSI (Windows-1251), UTF-8, UTF-8 BOM, UTF-8 BE BOM, UTF-8 LE BOM.

изменить кодировку в Notepad++

После преобразования файл нужно сохранить с помощью меню «Файл – Сохранить» или комбинации клавиш Ctrl-S.

Akelpad

Akelpad (скачать) – достаточно старая программа для работы с текстовыми файлами, которая все еще актуальна и может быть полезной. Фактически Akelpad является более продвинутой версией стандартной программы Блокнот из Windows. С его помощью можно открывать текстовые файлы большого размера, которые не открываются в Блокноте, выполнять поиск и замену с использованием регулярных выражений и менять кодировку текста.

Для того чтобы изменить кодировку текста с помощью Akelpad файл нужно открыть в данной программе. Если после открытия файла текст не читается, то нужно воспользоваться меню «Файл – Открыть».

открыть файл в Akelpad

В открывшемся окне нужно выделить текстовый файл, снять отметку «Автовыбор» и выбрать подходящую кодировку из списка. При этом в нижней части окна можно видеть, как будет отображаться текст.

выбрать кодировку в Akelpad

Для того чтобы изменить текущую кодировку текста нужно воспользоваться меню «Файл – Сохранить как» и сохранить документ с указанием новой схемы кодирования.

изменить кодировку в Akelpad

В отличие от Notepad++, текстовый редактор Akelpad позволяет сохранить файл в практически любой кодировке. В частности, доступны Windows 1251, DOS 886, UTF-8 и многие другие.

Посмотрите также:

  • Чем открыть PDF файл в Windows 7 или Windows 10
  • Как перевернуть страницу в Word
  • Как копировать текст с помощью клавиатуры
  • Как сделать рамку в Word
  • Как сделать буклет в Word

Автор
Александр Степушин

Создатель сайта comp-security.net, автор более 2000 статей о ремонте компьютеров, работе с программами, настройке операционных систем.

Остались вопросы?

Задайте вопрос в комментариях под статьей или на странице
«Задать вопрос»
и вы обязательно получите ответ.

Dogarik

0 / 0 / 0

Регистрация: 21.04.2015

Сообщений: 35

1

05.12.2019, 15:47. Показов 7513. Ответов 5

Метки xml (Все метки)


Доброго времени суток. Столкнулся с проблемой. Не могу при создании XML файла сменить кодировку.

Суть задачи следующая. Есть список в TXT файле из которого необходимо создать XML определенной структуры с кодировкой «Windows-1251». Не знаю как при создании файла установить нужную мне кодировку. Все время устанавливается «utf-8».
Буду благодарен любому совету.

P.S. Работаю в VS2019.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
class Program
    {
        static void Main(string[] args)
        {
            List<HumanData> HumanList = new List<HumanData>();
            string PathLoadFile = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\List.txt";
            string FullFileName = "VALIDATION-REQ-50-OBR-01-001.XML";
            string PathSaveFile = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\" + FullFileName;
 
            using (StreamReader stroka = new StreamReader(PathLoadFile, Encoding.Default))
            {
                string str; int index = 0;
                while ((str = stroka.ReadLine()) != null)
                {
                    string[] Fullstroka = str.Split(new char[] { ';' });
                    HumanList.Add(new HumanData()
                    {
                        Id = index,
                        Snils = Fullstroka[0].ToUpper(),
                        Surname = Fullstroka[1].ToUpper(),
                        Name = Fullstroka[2].ToUpper(),
                        Patronymic = Fullstroka[3].ToUpper(),
                        Birthday = Fullstroka[4].ToUpper(),
                        Sex = Fullstroka[5].ToUpper()
                    });
                    index++;
                }
            }
 
            XDocument xdoc = new XDocument();
            XElement DataBlock = new XElement("ФайлПФР");
 
            XElement FileName = new XElement("ИмяФайла", FullFileName);
            DataBlock.Add(FileName);
            XElement CreateDate = new XElement("ДатаФормирования", DateTime.Now.ToString("dd.MM.yyyy").ToUpper());
            DataBlock.Add(CreateDate);
            XElement Version = new XElement("ВерсияФормата", "1.0");
            DataBlock.Add(Version);
            XElement FileType = new XElement("ТипФайла", "ВАЛИДАЦИЯ_ЗАПРОС");
            DataBlock.Add(FileType);
            XElement Count = new XElement("КоличествоЗаписейВфайле", HumanList.Count);
            DataBlock.Add(Count);
 
            foreach(var ASD in HumanList)
            {
                XElement Request = new XElement("Валидация_запрос");
                XElement Id = new XElement("ИдентификаторЗапроса", (ASD.Id + 1).ToString());
                XElement Snils = new XElement("СНИЛС", ASD.Snils);
                XElement Fam = new XElement("Фамилия", ASD.Surname);
                XElement Name = new XElement("Имя", ASD.Name);
                XElement Otch = new XElement("Отчество", ASD.Patronymic);
                XElement Birthday = new XElement("ДатаРождения", ASD.Birthday);
                XElement Sex = new XElement("Пол", ASD.Sex);
                Request.Add(Id); Request.Add(Snils); Request.Add(Fam); Request.Add(Name);
                Request.Add(Otch); Request.Add(Birthday); Request.Add(Sex);
                DataBlock.Add(Request);
            }
 
            xdoc.Add(DataBlock);
            xdoc.Save(PathSaveFile);
        }
 
        public class HumanData
        {
            public int Id { get; set; }
            public string Snils { get; set; }
            public string Surname { get; set; }
            public string Name { get; set; }
            public string Patronymic { get; set; }
            public string Birthday { get; set; }
            public string Sex { get; set; }
        }
    }

Миниатюры

Изменение кодировки создаваемого XML файла
 

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

05.12.2019, 15:47

5

92 / 62 / 31

Регистрация: 22.12.2018

Сообщений: 121

05.12.2019, 15:59

2

Dogarik, нет возможности проверить совет, но попробуйте так



1



Dogarik

0 / 0 / 0

Регистрация: 21.04.2015

Сообщений: 35

05.12.2019, 16:37

 [ТС]

3

К сожалению не помогло.
Сократил немного код, вставил

C#
1
new XDeclaration("1.0", "Windows-1251", "Yes")

но эффекта никакого….ну или я криворук…

Текущий код такой

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
XDocument xdoc = new XDocument(new XDeclaration("1.0", "Windows-1251", "Yes"));
            XElement DataBlock = new XElement("ФайлПФР",
                new XElement("ИмяФайла", FullFileName),
                new XElement("ДатаФормирования", DateTime.Now.ToString("dd.MM.yyyy").ToUpper()),
                new XElement("ВерсияФормата", "1.0"),
                new XElement("ТипФайла", "ВАЛИДАЦИЯ_ЗАПРОС"),
                new XElement("КоличествоЗаписейВфайле", HumanList.Count));
                                 
            foreach(var ASD in HumanList)
            {
                XElement Request = new XElement("Валидация_запрос",
                new XElement("ИдентификаторЗапроса", (ASD.Id + 1).ToString()),
                new XElement("СНИЛС", ASD.Snils),
                new XElement("Фамилия", ASD.Surname),
                new XElement("Имя", ASD.Name),
                new XElement("Отчество", ASD.Patronymic),
                new XElement("ДатаРождения", ASD.Birthday),
                new XElement("Пол", ASD.Sex));
                DataBlock.Add(Request);
            }
 
            xdoc.Add(DataBlock);
            xdoc.Save(PathSaveFile);

На выходе:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="utf-8"?>
<ФайлПФР>
  <ИмяФайла>VALIDATION-REQ-50-OBR-01-001.XML</ИмяФайла>
  <ДатаФормирования>05.12.2019</ДатаФормирования>
  <ВерсияФормата>1.0</ВерсияФормата>
  <ТипФайла>ВАЛИДАЦИЯ_ЗАПРОС</ТипФайла>
  <КоличествоЗаписейВфайле>1555</КоличествоЗаписейВфайле>
  <Валидация_запрос>
    <ИдентификаторЗапроса>1</ИдентификаторЗапроса>
    <СНИЛС>ХХХ-ХХХ-ХХХ ХХ</СНИЛС>
    <Фамилия>�����</Фамилия>
    <Имя>�������</Имя>
    <Отчество>�������������</Отчество>
    <ДатаРождения>06.11.2012</ДатаРождения>
    <Пол></Пол>
  </Валидация_запрос>



0



dazering

92 / 62 / 31

Регистрация: 22.12.2018

Сообщений: 121

05.12.2019, 17:09

4

Лучший ответ Сообщение было отмечено Dogarik как решение

Решение

Dogarik, вот так надо декларировать =)

C#
1
XDocument xdoc = new XDocument(new XDeclaration("1.0", Encoding.GetEncoding("windows-1251").WebName, ""), new XElement("Root", "Content"));

Если на фрейморке, то ничего не надо делать. Если на коре, то надо добавить NuGet пакет System.Text.Encoding.CodePages и затем прописать

C#
1
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);



1



Ourn

68 / 38 / 11

Регистрация: 07.11.2019

Сообщений: 136

05.12.2019, 17:12

5

Не обещаю, что поможет, но можно попробовать сделать так

1. Устанавливаете nuget пакет System.Text.Encoding.CodePages — без него не будут доступны кодировки типа 1251.
2. Создаете кастомный StringWriter

C#
1
2
3
4
5
6
7
8
public sealed class WinStringWriter : StringWriter
{
    public WinStringWriter(StringBuilder builder)
        : base(builder)
    {
    }
    public override Encoding Encoding => Encoding.GetEncoding("windows-1251");
}

3. Привожу пример метода, который мне лень переделывать под запись в файл — его задача сформировать строку в нужной кодировке

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public static string ToXmlString(XElement element)
{
    Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); //стоит вынести в main
 
    var xmlWriterSettings = new XmlWriterSettings() 
    {
        Encoding = Encoding.GetEncoding("windows-1251")
    };
 
    var buffer = new StringBuilder();
    using (TextWriter output = new WinStringWriter(buffer))
    using (XmlWriter writer = XmlWriter.Create(output, xmlWriterSettings))
    {
        writer.WriteStartDocument();
 
        element.WriteTo(writer);
 
        writer.WriteEndDocument();
        writer.Flush();
    }
 
    return buffer.ToString();
}



1



0 / 0 / 0

Регистрация: 21.04.2015

Сообщений: 35

06.12.2019, 17:36

 [ТС]

6

Действительно, работаю в Core 2.1.
Не думал, что это важно, при описании проблемы, но теперь буду иметь ввиду.

Сделал все, как подсказали dazering и Ourn. Сработало.

Премного благодарен за потраченное время)))

P.S. Задача решена. Тему можно закрывать.



0



При записи изменений в XML документ

<data>
<country name="Liechtenstein">
    <rank updated="yes">Москва</rank>
    <year>2008</year>
    <gdppc>141100</gdppc>
    <neighbor name="Austria" direction="E"/>
    <neighbor name="Switzerland" direction="W"/>
</country>
<country name="Singapore">
    <rank updated="yes">Санкт-Петербург</rank>
    <year>2011</year>
    <gdppc>59900</gdppc>
    <neighbor name="Malaysia" direction="N"/>
</country>
<country name="Panama">
    <rank updated="yes">Новосибирск</rank>
    <year>2011</year>
    <gdppc>13600</gdppc>
    <neighbor name="Costa Rica" direction="W"/>
    <neighbor name="Colombia" direction="E"/>
</country>

с помощью метода

tree.write('output.xml')

слетает кириллица,

 from xml.dom.minidom import *
 import xml.etree.ElementTree as ET
 import ConfigParser

 conf = ConfigParser.RawConfigParser()
 conf.read('C:config.conf')# Путь до файла указывается в конфиге

 path = conf.get('Path:', 'path')

 xml2 = parse(path)
 tree = ET.parse(path)
 root = tree.getroot()

 i = 1
 for rank in root.iter('rank'):
     if i in [1]: 
        new_rank = 'Москва'
        rank.text = str(new_rank)
        rank.set('updated', 'yes')
 i += 1
 tree.write(path)

строчка

?xml version=»1.0″ encoding=»WINDOWS-1251″ standalone=»true»?>

в начале документа удаляется. Документ открываю в Notpade++ в нём и работаю.

задан 19 июл 2019 в 13:19

Varg Sieg's user avatar

Varg SiegVarg Sieg

1,1502 золотых знака13 серебряных знаков35 бронзовых знаков

4

Для того, чтобы при сохранении XML в файл добавлялась строчка <?xml version="1.0" ... нужно в метод write передавать флаг xml_declaration:

...
tree.write(path, xml_declaration=True)

В этом же методе можно указать название кодировки, что будет записана в декларации XML:

...
tree.write(path, encoding='WINDOWS-1251', xml_declaration=True)

ответ дан 22 июл 2019 в 7:24

gil9red's user avatar

gil9redgil9red

75.2k5 золотых знаков49 серебряных знаков113 бронзовых знаков

Здравствуйте, господа!

Честно говоря, не знаю, кому может пригодиться …

Мне надо было генерировать (для заказчика) и читать (от заказчика) XML в кодовой таблице Window-1251.

1. Опишем русскую кодировку в CPXML.Inc

Код: Выделить всё

XMLEnc               EQUATE(STRING)
XMLEnc:UTF8          EQUATE('UTF-8')
XMLEnc:UTF16         EQUATE('UTF-16')
XMLEnc:ISO88591      EQUATE('ISO-8859-1')
XMLEnc:WIN1251       EQUATE('WINDOWS-1251')

2. И заставим выводить данные в windows-1251 (CpXML.clw)

DOMToXMLFile procedure(*Document doc, string path, <*CSTRING newLine>, UNSIGNED Format = Format:AS_IS)

Код: Выделить всё

ret         BYTE
            CODE
            IF omitted(3)
                !ret=DOMToXMLFile(doc,path,,Format,XMLEnc:UTF8)
                ret=DOMToXMLFile(doc,path,,Format,XMLEnc:WIN1251)
            ELSE
                !ret=DOMToXMLFile(doc,path,newLine,Format,XMLEnc:UTF8)
                ret=DOMToXMLFile(doc,path,newLine,Format,XMLEnc:WIN1251)
            END
            RETURN ret

3. После чего получим XML-файл (например, в ExampleXMLParse) в кодировке Windows-1251, вполне отображаемый браузером. Но встаёт другая проблема — эти файлы не читаются кларионовским парсером (Шаблон ‘View XML File’ просто падает при загрузке). Ну что ж, тем хуже для парсера. Возьмём шестнадцатеричный редактор, найдём в модуле C60cpxml.dll текст ‘ISO-8859-1’, заменим на ‘WINDOWS-1251’ и добавим в конец ‘<0>’ .

4. Вопрос с документами в UTF-8 не рассматривается :(

—————————————
C уважением,
Юрий Философов,
Главный программист
Корпорация «Диполь», Саратов
E-mail yufil@tacis-dipol.ru (служ)
yufil@mail.ru (дом)
ICQ#75924439

(Добавление)

Когда-то мне пришлось более плотнее исследовать C6 XML Support. Сделал точно такие же изменения как Вы.

3. После чего получим XML-файл (например, в ExampleXMLParse) в кодировке Windows-1251, вполне отображаемый браузером.

Когда получил этот результат — обрадовался. Но попробовал, используя их классы создать свой XML, и очень разочаровался. Оказывается, классы напрочь отказываются работать с русскими тегами.

Но встаёт другая проблема — эти файлы не читаются кларионовским парсером (Шаблон ‘View XML File’ просто падает при загрузке). Ну >что ж, тем хуже для парсера.

Может проблема в кодовой странице, о которой писал Сергей Артюшенков.

Возьмём шестнадцатеричный редактор, найдём в модуле C60cpxml.dll текст ‘ISO-8859-1’, заменим на ‘WINDOWS-1251’ и добавим в конец ‘<0>’ .

Я не понял, тогда в этом случае все O’K, что ли?

С уважением, Семен Попов

Когда получил этот результат — обрадовался. Но попробовал, используя их классы создать свой XML, и очень разочаровался. Оказывается, классы напрочь отказываются работать с русскими тегами.

Пофиксил. Теперь работают :)

Когда получил этот результат — обрадовался. Но попробовал, используя их классы создать свой XML, и очень разочаровался. Оказывается, классы напрочь отказываются работать с русскими тегами.

А за это отвечает процедура CheckXMLName из CpXML.clw . Можно поставить в первую строку Return(0) — и будут приниматься любые теги :)

—————————————
C уважением,
Юрий Философов

Спасибо, попробую.

С уважением, Семен Попов

Когда-то мне пришлось более плотнее исследовать C6 XML Support. Сделал точно такие же изменения как Вы.

Это естественно. Но сгенерированные файлы не читались через Support. Потратил время, чтобы понять причину и добить, как заставить их читаться. О чём и рассказал :)

Я не понял, тогда в этом случае все O’K, что ли?

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

… исправленные модули для CW6.1 на http://www.tacis-dipol.ru/fil/XML1251.zip

—————————————
C уважением,
Юрий Философов
Написал: ClaList(2)

October 1 2009, 02:40

Category:

  • IT
  • Cancel

Здравствуйте, помогите пожалуйста разобраться в следующей ситуации:

есть xml файл в кодировке windows-1251 и у него в заголовке это тоже указано(encoding=»windows-1251″). Файл считывается, узлы, атрибуты и т.д. получаются, затем я меняю некоторые атрибуты и сохраняю измененный xml файл. В итоге, он сохраняются в кодировке UTF-8 но в заголовке xml файла по прежнему стоит windows-1251.

Так вот, как сохранить xml в кодировке windows-1251 или как сделать так, чтобы в заголовке стояло UTF-8 ?

\Исходный xml считывается примерно так:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
builder = factory.newDocumentBuilder();
Document

doc = builder.parse(new File(«name.xml»));

\здесь файл меняется
….
….

\а тут сохраняю измененный файл
Transformer t = TransformerFactory.newInstance().newTransformer();
StreamResult sr = new StreamResult(new FileOutputStream(new File(«edited.xml»)));
t.transform(new DOMsource(

doc ), sr);

спасибо

Понравилась статья? Поделить с друзьями:

Вот еще несколько интересных статей:

  • Как изменить масштаб на компьютере на рабочем столе windows 7
  • Как изменить контрастность монитора windows 10
  • Как изменить картинку при включении компьютера windows 10
  • Как изменить масштаб монитора на компьютере windows 10
  • Как изменить контраст экрана в windows 10

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии