Подробный гайд: Как узнать кодировку SVG: проверка XML-декларации, BOM и байтов - Часть 3
16. Как конвертировать файл в UTF-8
Важно
Перед конвертацией сделайте резервную копию:
cp file.svg file.svg.bak
или в Windows:
Copy-Item file.svg file.svg.bak
Если файл в Windows-1251
Linux/macOS:
iconv -f windows-1251 -t utf-8 file.svg -o file-utf8.svg
Затем убедитесь, что в начале файла стоит:
<?xml version="1.0" encoding="UTF-8"?>
Если её нет, добавьте.
Если там написано:
<?xml version="1.0" encoding="windows-1251"?>
замените на:
<?xml version="1.0" encoding="UTF-8"?>
Если файл в KOI8-R
iconv -f koi8-r -t utf-8 file.svg -o file-utf8.svg
Если файл в UTF-16
iconv -f UTF-16 -t UTF-8 file.svg -o file-utf8.svg
Если известно направление:
iconv -f UTF-16LE -t UTF-8 file.svg -o file-utf8.svg
или:
iconv -f UTF-16BE -t UTF-8 file.svg -o file-utf8.svg
17. Конвертация через Python
Пример: файл в windows-1251, нужно сделать UTF-8.
from pathlib import Path
source = Path("file.svg")
target = Path("file-utf8.svg")
text = source.read_text(encoding="windows-1251")
# Если нужно, исправляем XML declaration
if 'encoding="windows-1251"' in text:
text = text.replace(
'encoding="windows-1251"',
'encoding="UTF-8"'
)
target.write_text(text, encoding="utf-8")
print("Готово")
Для UTF-16:
text = Path("file.svg").read_text(encoding="utf-16")
Path("file-utf8.svg").write_text(text, encoding="utf-8")
18. Конвертация через PowerShell
Если файл в Windows-1251 и нужно сохранить в UTF-8.
Для PowerShell 7:
$content = Get-Content -Path .\file.svg -Encoding ([System.Text.Encoding]::GetEncoding(1251))
$content | Set-Content -Path .\file-utf8.svg -Encoding utf8NoBOM
Для старого Windows PowerShell UTF8 может добавить BOM:
$content = Get-Content -Path .\file.svg -Encoding Default
$content | Set-Content -Path .\file-utf8.svg -Encoding UTF8
Но лучше контролировать результат вручную и проверять байты.
19. Типичные симптомы и их значение
| Что видите | Возможная причина | Что делать |
|---|---|---|
Текст |
UTF-8 открыли как Windows-1251 | Переоткрыть как UTF-8 |
тест в виде странных латинских букв |
Неверное открытие/двойное перекодирование | Проверить исходник, не сохранять испорченную версию |
???? |
Символы уже потеряны при сохранении | Восстановить из резервной копии, если есть |
| Файл открывается, но русский текст не отображается в браузере | Неверная XML-декларация или HTTP-заголовок | Проверить encoding, Content-Type, байты |
Файл начинается с 1F 8B |
Это gzip/.svgz | Распаковать |
Файл начинается с EF BB BF |
UTF-8 with BOM | Обычно нормально, но лучше UTF-8 без BOM |
Файл начинается с FF FE |
UTF-16 LE | Конвертировать в UTF-8 для веба |
В декларации windows-1251, а файл открывается только как UTF-8 |
Декларация неверна | Исправить на UTF-8 |
20. Как исправить неверную XML-декларацию
Если файл реально в UTF-8, но внутри написано:
<?xml version="1.0" encoding="windows-1251"?>
исправьте на:
<?xml version="1.0" encoding="UTF-8"?>
Если XML-декларации нет, можно добавить её самой первой строкой:
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
<text x="10" y="50">Текст</text>
</svg>
Важно:
Перед <?xml не должно быть никаких символов, кроме, возможно, BOM. Никаких пустых строк, пробелов или комментариев до декларации быть не должно.
21. Проверка валидности SVG после исправления
Если установлен libxml2, выполните:
xmllint --noout file.svg
Если ошибок нет, вывод будет пустым.
Можно также проверить, что файл текстовый:
file -i file.svg
И посмотреть первые строки:
head file.svg
22. Особый случай: SVG встроен в HTML
Если SVG не отдельный файл, а вставлен прямо в HTML:
<svg>
<text>Текст</text>
</svg>
то кодировка обычно определяется кодировкой HTML-страницы.
Проверяйте:
<meta charset="UTF-8">
и HTTP-заголовок страницы.
Но если SVG подключается отдельно:
<img src="image.svg">
или через <object>, <iframe>, CSS-фон, то SVG-файл будет использовать собственную кодировку и/или HTTP-заголовок.
23. Практический алгоритм проверки
Сделайте так:
- Откройте файл в редакторе.
- Посмотрите первую строку:
<?xml version="1.0" encoding="..."?>
- Посмотрите первые байты:
xxd -l 16 file.svg
- Если первые байты
1F 8B, распакуйте файл. - Если есть BOM, определите кодировку по BOM.
- Если BOM нет, попробуйте открыть как:
- UTF-8;
- Windows-1251;
- KOI8-R;
- ISO-8859-5.
- Если кириллица стала нормальной, это и есть фактическая кодировка.
- Для веба конвертируйте файл в UTF-8 без BOM.
- Убедитесь, что XML-декларация указывает:
<?xml version="1.0" encoding="UTF-8"?>
24. Рекомендуемый стандарт для SVG
Для SVG в веде лучше всего использовать:
Кодировка: UTF-8
BOM: нет
Заголовок: image/svg+xml; charset=utf-8
XML declaration: <?xml version="1.0" encoding="UTF-8"?>
Пример правильного начала файла:
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<text x="10" y="50">Пример текста</text>
</svg>
25. Краткая шпаргалка
1. Открыть файл как текст.
2. Посмотреть <?xml ... encoding="..."?>.
3. Посмотреть первые байты:
xxd -l 16 file.svg
EF BB BF → UTF-8 BOM
FF FE → UTF-16 LE
FE FF → UTF-16 BE
1F 8B → gzip/.svgz
4. Проверить:
file -i file.svg
5. При подозрении на Windows-1251:
iconv -f windows-1251 -t utf-8 file.svg -o file-utf8.svg
6. Для веба использовать:
UTF-8 без BOM
encoding="UTF-8"
Content-Type: image/svg+xml; charset=utf-8
Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.