如何编码为 base64 非 ASCII 字符?

How to encode to base64 non-ASCII characters?

有人可以向我解释如何将字符串“®”编码为 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,它们对应于“1bA”。

我不知道如何处理非 ASCII 字符。通过对任何 ASCII 字符进行相同的计算,就可以了。

有谁知道我做错了什么吗?

Base64 将二进制数据编码为 ASCII 文本。 Unicode 字符 ® 在应用 Base64 之前可以用任何编码编码,但是 UTF-8 很方便,因为它可以编码任何 Unicode 码位。

问题中的错误是在转换为 UTF-8 时。这些位从右到左分配最低有效位,但从左到右分配最高有效位。

  1. ® 的 Unicode 代码点开始,即 U+00AE
  2. 转换为二进制:10101110
  3. 代码点 U+0080 到 U+07FF 需要两字节 UTF-8 编码:110xxxxx 10xxxxxx。按如下方式分配位:11000010 10101110
  4. 将数据分组为 3 字节块。只有两个字节,所以完成后需要一个字节的填充。
  5. 重组为 6 位块:110000 101010 111000
  6. 转换为十进制:48 42 56
  7. 使用下面的 base64 table + 一个 pad: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