Как кодировать в base64 не-ASCII символы? - PullRequest
0 голосов
/ 31 марта 2020

Может кто-нибудь объяснить мне, как кодировать строку «®» в base64 (я просто выбрал любой не-ASCII символ для примера)? Этот символ представляет код 174 или 10101110 в двоичном виде.

В результате получается "wq4 =" (получил это, проверив два разных сайта, которые выполняют кодирование base64 онлайн).

Я понимаю, как Система кодирования base64 работает. Для символов ASCII я могу получить правильные результаты, но с любым не-ASCII-символом результат никогда не совпадет.

Я пробовал два способа:

  1. Использование непосредственно двоичного файла для этого символа (10101110) и разделив его на 2 порции по 6 битов, которые у меня есть: 101011 и 100000. Base64 они соответствуют "rg"
  2. Сначала преобразуем 10101110 в UTF-8, поэтому у меня есть 2 байта: 11010101 и 10110000. Затем я смешиваю эти два байта и разделяю их на куски по 6 битов: 110101 011011 000000. Базовому значению base64 они соответствуют «1 бА».

Я понятия не имею, как поступить с символами, отличными от ASCII. Делая те же вычисления с любым символом ASCII, просто работает.

Кто-нибудь знает, что я делаю неправильно?

1 Ответ

1 голос
/ 31 марта 2020

Base64 кодирует двоичные данные в виде текста ASCII. Символ Unicode ® может быть закодирован любой кодировкой перед применением Base64, но UTF-8 удобен тем, что может кодировать любую кодовую точку Unicode.

Ошибка в вопросе заключалась в преобразовании в UTF-8. Биты распределяются младшим значащим битом сначала справа налево, но распределяются старшим значащим битом слева направо.

  1. Начните с кодовой точки Unicode для ®, которая равна U+00AE .
  2. Преобразование в двоичный код: 10101110
  3. Для кодовых точек от U + 0080 до U + 07FF требуется двухбайтовая кодировка UTF-8: 110xxxxx 10xxxxxx. Распределите биты следующим образом: 110 00010 10 101110
  4. Сгруппируйте данные в 3-байтовые порции. Для завершения потребуется только два байта, поэтому потребуется один байт заполнения.
  5. Перегруппировка в 6-битные порции: 110000 101010 111000.
  6. Преобразование в десятичное число: 48 42 56
  7. Использование таблица base64 ниже + один блокнот: wq4=
Value Encoding  Value Encoding  Value Encoding  Value Encoding
    0 A            17 R            34 i            51 z
    1 B            18 S            35 j            52 0
    2 C            19 T            36 k            53 1
    3 D            20 U            37 l            54 2
    4 E            21 V            38 m            55 3
    5 F            22 W            39 n            56 4
    6 G            23 X            40 o            57 5
    7 H            24 Y            41 p            58 6
    8 I            25 Z            42 q            59 7
    9 J            26 a            43 r            60 8
   10 K            27 b            44 s            61 9
   11 L            28 c            45 t            62 +
   12 M            29 d            46 u            63 /
   13 N            30 e            47 v
   14 O            31 f            48 w         (pad) =
   15 P            32 g            49 x
   16 Q            33 h            50 y
...