Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Программирование Новый топик    Ответить
 Конвертер кодовых страниц для XML  [new]
mayton
Member

Откуда: loopback
Сообщений: 41808
Привет.

Надо-б сделать что то такое.

$ tocodepage UTF-16 --input-file=source.xml


Исходная кодовая страница детектится автоматом.

Еще варианты использования:

$ tocodepage WIN-1251 --input-file=source.xml --output-file=dest.xml


Для множества XML-файлов с разной входной кодировкой. Все переписываем в UTF-8.
FOR /r %%F in *.xml DO tocodepage UTF-8 "%%F"


#!/bin/bash
for F in ./config/*
do
   tocodepage UTF-8 "$F"
done


В отличие от прочих текстовых файлов нам известно что шапка XML идёт в ASCII и содержит явный
указатель исходной кодовой страницы.
Примеры шапок.

<?xml version="1.0" encoding="koi8-r"?>

Шапка может (теоретически) не содержать перевод на новую строку. В этом случае можно
просто детектировать стоп-символ "?>"

Если шапки нет - то предполагается что XML-файл в кодировке UTF-8.

Если --output-file не указан - то предполагается что исходный файл будет переписан поверх.

Go-go кодить.
26 апр 19, 10:59    [21872344]     Ответить | Цитировать Сообщить модератору
 Re: Конвертер кодовых страниц для XML  [new]
Владимир П.
Member

Откуда: Екатеринбург
Сообщений: 437
mayton,

А чего там кодить? Есть grep и awk, чтобы достать кодировку из строки "<?xml...". И есть iconv, чтобы перевести текстовый файл из одной кодировки в другую.
26 апр 19, 15:16    [21872757]     Ответить | Цитировать Сообщить модератору
 Re: Конвертер кодовых страниц для XML  [new]
Dima T
Member

Откуда:
Сообщений: 13915
mayton
В отличие от прочих текстовых файлов нам известно что шапка XML идёт в ASCII и содержит явный
указатель исходной кодовой страницы.

Есть один источник XML в UTF-16 и там такой заголовок

0000000000: 3C 00 3F 00 78 00 6D 00 │ 6C 00 20 00 76 00 65 00 < ? x m l v e
0000000010: 72 00 73 00 69 00 6F 00 │ 6E 00 3D 00 22 00 31 00 r s i o n = " 1
0000000020: 2E 00 30 00 22 00 20 00 │ 65 00 6E 00 63 00 6F 00 . 0 " e n c o
0000000030: 64 00 69 00 6E 00 67 00 │ 3D 00 22 00 75 00 74 00 d i n g = " u t
0000000040: 66 00 2D 00 31 00 36 00 │ 22 00 3F 00 3E 00 0D 00 f - 1 6 " ? > ♪
26 апр 19, 15:23    [21872764]     Ответить | Цитировать Сообщить модератору
 Re: Конвертер кодовых страниц для XML  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3429
Dima T, то как в языке организовано хранение строк, совершенно не относится к тому, какое формат содержимого имеет файл
в C# все строки в памяти хранятся в UTF-16, если вы хотите хранить памяти в другой кодировке, используйте byte[]
26 апр 19, 15:28    [21872771]     Ответить | Цитировать Сообщить модератору
 Re: Конвертер кодовых страниц для XML  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3429
Roman Mejtes
Dima T, то как в языке организовано хранение строк, совершенно не относится к тому, какое формат содержимого имеет файл
в C# все строки в памяти хранятся в UTF-16, если вы хотите хранить памяти в другой кодировке, используйте byte[]

вообще похоже, что в посте файл, я извиняюсь :) не всегда, всё соответствует спецификации 1 к 1, особенно в сторонних системах
26 апр 19, 15:29    [21872773]     Ответить | Цитировать Сообщить модератору
 Re: Конвертер кодовых страниц для XML  [new]
mayton
Member

Откуда: loopback
Сообщений: 41808
Владимир П.
mayton,

А чего там кодить? Есть grep и awk, чтобы достать кодировку из строки "<?xml...". И есть iconv, чтобы перевести текстовый файл из одной кодировки в другую.

Я добавлю что мы не будем обсуждать использование grep и awk.
26 апр 19, 15:43    [21872784]     Ответить | Цитировать Сообщить модератору
 Re: Конвертер кодовых страниц для XML  [new]
mayton
Member

Откуда: loopback
Сообщений: 41808
Dima T
mayton
В отличие от прочих текстовых файлов нам известно что шапка XML идёт в ASCII и содержит явный
указатель исходной кодовой страницы.

Есть один источник XML в UTF-16 и там такой заголовок

0000000000: 3C 00 3F 00 78 00 6D 00 │ 6C 00 20 00 76 00 65 00 < ? x m l v e
0000000010: 72 00 73 00 69 00 6F 00 │ 6E 00 3D 00 22 00 31 00 r s i o n = " 1
0000000020: 2E 00 30 00 22 00 20 00 │ 65 00 6E 00 63 00 6F 00 . 0 " e n c o
0000000030: 64 00 69 00 6E 00 67 00 │ 3D 00 22 00 75 00 74 00 d i n g = " u t
0000000040: 66 00 2D 00 31 00 36 00 │ 22 00 3F 00 3E 00 0D 00 f - 1 6 " ? > ♪

Да. Тут еще мысли.
1) BOM-заголовок? Есть или нет? Я невкурсе.
2) Для UTF-16 шапка xml будет содержать явную последовательность чередующихся нулей. В принципе можно
тоже детектировать. Тогда атрибут encoding="UTF-16" уже не имеет значения. Мы и так знаем с чем имеем
дело. Хотя в практике я очень редко встречал файлы сохранённые именно в двух-байтной кодировке.
26 апр 19, 18:43    [21872947]     Ответить | Цитировать Сообщить модератору
 Re: Конвертер кодовых страниц для XML  [new]
Dima T
Member

Откуда:
Сообщений: 13915
mayton
Dima T
пропущено...

Есть один источник XML в UTF-16 и там такой заголовок

0000000000: 3C 00 3F 00 78 00 6D 00 │ 6C 00 20 00 76 00 65 00 < ? x m l v e
0000000010: 72 00 73 00 69 00 6F 00 │ 6E 00 3D 00 22 00 31 00 r s i o n = " 1
0000000020: 2E 00 30 00 22 00 20 00 │ 65 00 6E 00 63 00 6F 00 . 0 " e n c o
0000000030: 64 00 69 00 6E 00 67 00 │ 3D 00 22 00 75 00 74 00 d i n g = " u t
0000000040: 66 00 2D 00 31 00 36 00 │ 22 00 3F 00 3E 00 0D 00 f - 1 6 " ? > ♪

Да. Тут еще мысли.
1) BOM-заголовок? Есть или нет? Я невкурсе.

Тут видно что его нет.
mayton
2) Для UTF-16 шапка xml будет содержать явную последовательность чередующихся нулей. В принципе можно
тоже детектировать. Тогда атрибут encoding="UTF-16" уже не имеет значения. Мы и так знаем с чем имеем
дело. Хотя в практике я очень редко встречал файлы сохранённые именно в двух-байтной кодировке.

Да, это экзотика. У меня только один упоротый клиент такое дал и сказал что получай или так или никак. Но C# такое переваривает.

Полистал доки С# - готовых классов нет для перекодировки XML. Разве что сначала парсить заголовок, получая исходную кодировку, а затем читать как текстовый файл и перегонять в нужную кодировку. Может в Java есть что-то подходящее.
26 апр 19, 19:05    [21872967]     Ответить | Цитировать Сообщить модератору
 Re: Конвертер кодовых страниц для XML  [new]
Dima T
Member

Откуда:
Сообщений: 13915
Кстати непонятен смысл этой конвертации в единую кодировку. Средства чтения XML заточены на конвертацию из кодировки XML в кодировку внутри ЯП. Наверно поэтому и нет того что ты ищешь, просто ненужно.
26 апр 19, 19:12    [21872970]     Ответить | Цитировать Сообщить модератору
 Re: Конвертер кодовых страниц для XML  [new]
Alexander A. Sak
Member

Откуда: Омск
Сообщений: 1032
А xmllint рассматривается?
26 апр 19, 19:14    [21872972]     Ответить | Цитировать Сообщить модератору
 Re: Конвертер кодовых страниц для XML  [new]
mayton
Member

Откуда: loopback
Сообщений: 41808
Dima T
mayton
2) Для UTF-16 шапка xml будет содержать явную последовательность чередующихся нулей. В принципе можно
тоже детектировать. Тогда атрибут encoding="UTF-16" уже не имеет значения. Мы и так знаем с чем имеем
дело. Хотя в практике я очень редко встречал файлы сохранённые именно в двух-байтной кодировке.

Да, это экзотика. У меня только один упоротый клиент такое дал и сказал что получай или так или никак. Но C# такое переваривает.

Полистал доки С# - готовых классов нет для перекодировки XML. Разве что сначала парсить заголовок, получая исходную кодировку, а затем читать как текстовый файл и перегонять в нужную кодировку. Может в Java есть что-то подходящее.

Я вижу себе такой алгоритм. По первым двум байтам мы уже можем многое сказать о документе.

Варианты.

1) UTF-16 (предположительно)
3C 00


2) Неизвестная пока кодировка но точно-точно не UTF-16. Далее - по алгоритму читаем encoding и принимаем
решение о том какой конвертер взять. 99% это будет оди из трех Windows-1251, Utf-8, cp866 для стран СНГ.
3C 3F


3) БОМ-шапка. Тут ничего пока не могу сказать.

https://ru.wikipedia.org/wiki/Маркер_последовательности_байтов

Я эту шапку встречал очень редко. В данной постановке я согласен ее даже проигнорировать
и посчитать двоичным файлом. Если в топике меня не убедят что этих БОМ-файлов много
и они кому-то нужны. Вобщем как Неуловимый Джо.

По сути моя задача достаточно шкурная. Она связана с массовой перекодировкой неизвестных XML в utf-8.
26 апр 19, 19:16    [21872975]     Ответить | Цитировать Сообщить модератору
 Re: Конвертер кодовых страниц для XML  [new]
mayton
Member

Откуда: loopback
Сообщений: 41808
Alexander A. Sak
А xmllint рассматривается?

Смотрю http://xmlsoft.org/xmllint.html

Интересно. Вроде у него есть опция --encode ENCODING
26 апр 19, 19:54    [21872991]     Ответить | Цитировать Сообщить модератору
 Re: Конвертер кодовых страниц для XML  [new]
mayton
Member

Откуда: loopback
Сообщений: 41808
Dima T
Да, это экзотика. У меня только один упоротый клиент такое дал и сказал что получай или так или никак. Но C# такое переваривает.

Да помню. Типа дотнетовская сериализация максимально упрощённая. С нулевыми расходами.
26 апр 19, 19:57    [21872994]     Ответить | Цитировать Сообщить модератору
 Re: Конвертер кодовых страниц для XML  [new]
Изопропил
Member

Откуда:
Сообщений: 31189
mayton
3) БОМ-шапка. Тут ничего пока не могу сказать

А говорить ничего не надо

Если есть маркер BOM - использовать его
mayton
99% это будет оди из трех Windows-1251, Utf-8, cp866 для стран СНГ.

Если кодировка опознана - конкретная уже значения не имеет.
Или ты сам таблицы колхозишь?
26 апр 19, 21:05    [21873043]     Ответить | Цитировать Сообщить модератору
 Re: Конвертер кодовых страниц для XML  [new]
mayton
Member

Откуда: loopback
Сообщений: 41808
xmllint тестирую. Есть шероховатости с UTF-16. Проверяю.
#!/bin/bash -v

iconv -f utf-8 -t windows-1251 probe.xml -o probe.win-1251.xml
iconv -f utf-8 -t cp866        probe.xml -o probe.cp866.xml
iconv -f utf-8 -t utf-16       probe.xml -o probe.utf-16xml

xmllint  --encode utf-8 --output 01.from.win-1251.xml probe.win-1251.xml
xmllint  --encode utf-8 --output 02.from.cp866.xml    probe.cp866.xml
xmllint  --encode utf-8 --output 03.from.utf-16       probe.utf-16xml
27 апр 19, 01:07    [21873172]     Ответить | Цитировать Сообщить модератору
 Re: Конвертер кодовых страниц для XML  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5107
Dima T
Кстати непонятен смысл этой конвертации в единую кодировку. Средства чтения XML заточены на конвертацию из кодировки XML в кодировку внутри ЯП. Наверно поэтому и нет того что ты ищешь, просто ненужно.
+1
1 июл 19, 12:19    [21918043]     Ответить | Цитировать Сообщить модератору
 Re: Конвертер кодовых страниц для XML  [new]
mayton
Member

Откуда: loopback
Сообщений: 41808
Я помню что эту проблему для себя поднял после столкновения с fb2. Толи там кодировка не соотвествовала. Толи еще что-то было.
1 июл 19, 13:59    [21918136]     Ответить | Цитировать Сообщить модератору
Все форумы / Программирование Ответить