Я хочу кодировать и декодировать двоичные данные в XML файле (с помощью Python, но что угодно). Мне приходится сталкиваться с тем, что содержимое тега XML имеет незаконные символы. Только разрешенные описаны в Спецификации XML:
Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
Это означает, что недопустимыми являются:
- 29 Управляющие символы Unicode являются незаконными (0x00 - 0x20), т.е. (000xxxxx), за исключением 0x09, 0x0A, 0x0D
- Любое представление символа Юникода выше 2 байтов (UTF-16 +) является незаконным (U + D800 - U + DFFF), т.е. (11011xxx)
- Специальные Uncharacters Unicode являются незаконными (0xFFFE - 0xFFFF), т.е. (11111111 1111111x)
- <, > и в соответствии с этим сообщением для содержимого объектов
1 байт может кодировать 256 возможных. При этих ограничениях первый байт ограничен 256-29-8-1-3 = 215 возможных.
Из этих первых байтов 215 возможно, base64 использует только 64 варианта. Base64 генерирует 33% служебных данных (6 бит становится 1 байтом, однажды закодированным с base64).
Итак, мой вопрос прост: Есть ли более эффективный алгоритм, чем base64, для кодирования двоичных данных в XML? Если нет, где мы должны начать его создавать? (библиотеки и т.д.)
NB: Вы не ответили бы на это сообщение: "Вы не должны использовать XML для кодирования двоичных данных, потому что...". Только не надо. Вы могли бы в лучшем случае утверждать, почему бы не использовать 215 возможностей для плохой поддержки парсера XML.
NB2: Я не говорю о втором байте, но, безусловно, есть некоторые соображения, которые могут возникнуть относительно количества возможностей и того факта, что он должен начинаться с 10xxxxxx, чтобы уважать стандарт UTF8, когда мы используем дополнительные Unicode-плоскости (что если нет?).