SVG в Base64 не отображается? Практическое решение для инженеров
С этой проблемой в реальных проектах сталкиваются постоянно:
- Ваш
img src="data:image/svg+xml;base64,..."выглядит корректно, но на экране ничего нет. - Та же строка SVG работает в одном месте и ломается в
background-imageв CSS. - Ошибку трудно заметить на ревью кода, но исправлять ее дорого.
Если эта ситуация вам знакома, это руководство поможет пройти понятный и повторяемый путь к исправлению.
Почему это сложно исправить
Проблема редко сводится к одной сломанной строке. Чаще это целая цепочка причин:
- Исходный SVG может быть уже невалидным.
- Кодировка может не соответствовать целевому контексту.
- HTML, CSS и JSON каждый требуют разного поведения экранирования.
- Правила очистки и рендеринга варьируются по окружению.
Вот почему один SVG может рендериться в одном контексте и ломаться в другом.
Наиболее распространенные корневые причины (по приоритету)
-
Неправильный MIME prefix
Используйтеdata:image/svg+xml;base64,илиdata:image/svg+xml,. -
Неправильный поток Base64 кодирования
Прямойbtoa(svg)может сломаться, когда SVG содержит не-ASCII символы. -
Несоответствие экранирования по контекстам
CSS background-image требует другое экранирование, чем<img>.
Решение SVGView
SVGView производит работающий Base64 SVG через несколько контекстов:
- Проверка: убедитесь, что SVG валиден перед кодированием
- Очистка: удалите любой небезопасный контент
- Кодирование: произведите валидный
data:image/svg+xml;base64,для контекста
Как использовать в SVGView
- Откройте SVG Viewer
- Вставьте SVG или загрузите его
- Нажмите "Экспорт" и выберите "Data URI (Base64)"
- Скопируйте результат и поместите в img src или background-image
Двойное кодирование (Base64) против некодированного
- Base64 (
data:image/svg+xml;base64,...): лучше для<img>и хранения - Raw (
data:image/svg+xml,...): лучше для CSS, когда вы можете контролировать экранирование
Резюме
Проблема с SVG в Base64 обычно складывается из нескольких причин сразу. Подход SVGView прост: сначала проверьте файл, затем очистите его и только после этого кодируйте. Такой порядок заметно повышает шанс получить SVG, который стабильно работает в разных местах.