Подробный гайд: Как узнать кодировку SVG: проверка XML-декларации, BOM и байтов - Часть 1

Как узнать кодировку SVG: проверка XML-декларации, BOM и байтов, определение через редакторы, file, Python и iconv, исправление кириллицы и конвертация в UTF-8.

2026.09.20                  


Подробный гайд: Как узнать кодировку SVG: проверка XML-декларации, BOM и байтов - Часть 1Подробный гайд: Как узнать кодировку SVG: проверка XML-декларации, BOM и байтов - Часть 1

1. Коротко: главное правило

.svg — это текстовый файл на основе XML. Чаще всего он должен быть в UTF-8.

Кодировку можно узнать по трём признакам:

  1. Фактические байты файла — это самое надёжное.
  2. BOM-метка, если она есть: EF BB BF, FF FE, FE FF и т.д.
  3. XML-декларация в начале файла:
<?xml version="1.0" encoding="UTF-8"?>

Но важно:

Надпись encoding="UTF-8" не гарантирует, что файл действительно сохранён в UTF-8. Смотреть нужно прежде всего на байты и на то, как текст отображается при открытии в разных кодировках.




2. Что вообще означает «кодировка SVG»

SVG — это XML-документ.

Пример:

<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="100">
  <text x="10" y="50">Текст</text>
</svg>

Если в файле есть русский текст, то от кодировки зависит, как будут закодированы буквы:

Текст Кодировка Байты примерно
тест UTF-8 D1 82 D0 B5 D1 81 D1 82
тест Windows-1251 F2 E5 F1 F2
тест KOI8-R D4 C5 D3 D4

Если файл открыт не в той кодировке, вместо русского текста будут вещи вроде:

Текст

или

тест

или

????

3. Быстрая проверка: откройте файл как текст

Вариант 1. Открыть в нормальном текстовом редакторе

Хорошо подходят:

  • VS Code;
  • Notepad++;
  • Sublime Text;
  • IntelliJ IDEA / WebStorm / PhpStorm;
  • Kate;
  • gedit;
  • Блокнот в современных Windows тоже можно, но лучше специализированные редакторы.

Если видите нормальный XML и нормальную кириллицу:

<text>Привет</text>

скорее всего файл в UTF-8.

Если видите мусор:

<text>Привет</text>

значит файл, вероятно, не в той кодировке, в которой его пытается открыть редактор.


4. Проверьте XML-декларацию

Откройте файл и посмотрите первую строку.

Там может быть:

<?xml version="1.0" encoding="UTF-8"?>

или:

<?xml version="1.0" encoding="windows-1251"?>

или:

<?xml version="1.0"?>

Что это значит

Первая строка Вероятный вывод
<?xml version="1.0" encoding="UTF-8"?> Заявлен UTF-8
<?xml version="1.0" encoding="windows-1251"?> Заявлена Windows-1251
<?xml version="1.0" encoding="KOI8-R"?> Заявлена KOI8-R
<?xml version="1.0"?> Кодировка не указана явно
XML-декларации нет Кодировка не указана явно

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


5. Проверка BOM-метки

BOM — это специальные байты в начале файла, которые подсказывают кодировку. Посмотрите первые байты файла.


В Linux / macOS

xxd -l 16 file.svg

или:

hexdump -C file.svg | head

В Windows PowerShell

Format-Hex -Path .\file.svg -Count 16

Таблица BOM

Первые байты Кодировка
EF BB BF UTF-8 with BOM
FF FE UTF-16 LE
FE FF UTF-16 BE
FF FE 00 00 UTF-32 LE
00 00 FE FF UTF-32 BE

Для SVG в вебе лучше всего использовать UTF-8 без BOM. BOM обычно допустим, но иногда может создавать проблемы.


6. Как понять кодировку по первым байтам

Допустим, вы выполнили:

xxd -l 16 file.svg

Пример 1: обычный UTF-8 без BOM

00000000: 3c3f 786d 6c20 7665 7273 696f 6e3d 2231  <?xml version="1

Начинается с <?xml. Это обычный текст. Скорее всего UTF-8 или другая однобайтовая кодировка. Нужна дополнительная проверка.


Пример 2: UTF-8 with BOM

00000000: efbb bf3c 3f78 6d6c 2076 6572 7369 6f6e  ...<?xml version

Видно ef bb bf — это UTF-8 BOM.

Пример 3: UTF-16 LE

00000000: fffe 3c00 3f00 7800 6d00 6c00 ...

Видно ff fe — это, вероятнее всего, UTF-16 LE.


Пример 4: gzip-файл, то есть .svgz

00000000: 1f8b 0800 ...

Если первые байты 1F 8B, это gzip. Возможно, у вас не обычный .svg, а сжатый .svgz.


7. Проверка через команду file

В Linux и macOS:

file -i file.svg

или:

file --mime-encoding file.svg

Пример ответа:

file.svg: image/svg+xml; charset=utf-8

или:

file.svg: text/xml; charset=utf-8


или:

file.svg: text/plain; charset=iso-8859-1

Но учтите: file может ошибаться, особенно если файл маленький или в нём мало не-ASCII символов.


8. Проверка через Python

Хороший способ — проверить:

  1. BOM;
  2. XML-декларацию;
  3. автоматическое определение кодировки.

Установите библиотеку для определения кодировки:

pip install charset-normalizer

или:

pip install chardet

Пример скрипта:

import sys
import re
from pathlib import Path

try:
    from charset_normalizer import from_bytes
except ImportError:
    from_bytes = None

path = Path(sys.argv[1])
data = path.read_bytes()

print("Файл:", path)
print("Размер:", len(data), "байт")

# Проверка на gzip
if data.startswith(b"\x1f\x8b"):
    print("Похоже, это gzip. Возможно, файл .svgz, а не обычный .svg")

# Проверка BOM
if data.startswith(b"\xef\xbb\xbf"):
    print("BOM: UTF-8")
elif data.startswith(b"\xff\xfe\x00\x00"):
    print("BOM: UTF-32 LE")
elif data.startswith(b"\x00\x00\xfe\xff"):
    print("BOM: UTF-32 BE")
elif data.startswith(b"\xff\xfe"):
    print("BOM: UTF-16 LE")
elif data.startswith(b"\xfe\xff"):
    print("BOM: UTF-16 BE")
else:
    print("BOM: нет")

# Поиск encoding в XML declaration
match = re.search(
    rb'<\?xml[^>]*encoding=["\']([^"\']+)["\']',
    data[:1000],
    re.IGNORECASE
)

if match:
    declared = match.group(1).decode("ascii", errors="replace")
    print("Заявленная кодировка в XML:", declared)
else:
    print("Заявленная кодировка в XML: не найдена")

# Автоматическое определение
if from_bytes:
    result = from_bytes(data).best()
    print("Автоматически вероятная кодировка:", result)
else:
    print("charset-normalizer не установлен")

Запуск:

python detect_svg_encoding.py file.svg

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

Файл: file.svg
Размер: 532 байт
BOM: нет
Заявленная кодировка в XML: UTF-8
Автоматически вероятная кодировка: utf_8

Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.


Статью подготовил: Аверко Денис Сергеевич @Nymexis г. Омск (специалист по ЗИ)

Комментарии

Загрузка...
Если комментарии не загружаются, можете попробовать отключить блокировщик рекламы для этого сайта