Подробный гайд: Как узнать кодировку SVG: проверка XML-декларации, BOM и байтов - Часть 1
1. Коротко: главное правило
.svg — это текстовый файл на основе XML. Чаще всего он должен быть в UTF-8.
Кодировку можно узнать по трём признакам:
- Фактические байты файла — это самое надёжное.
- BOM-метка, если она есть:
EF BB BF,FF FE,FE FFи т.д. - 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
Хороший способ — проверить:
- BOM;
- XML-декларацию;
- автоматическое определение кодировки.
Установите библиотеку для определения кодировки:
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
Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.