如何编码为 base64 非 ASCII 字符?
How to encode to base64 non-ASCII characters?
有人可以向我解释如何将字符串“®”编码为 base64(我只是选择了任何非 ASCII 字符来举例说明)吗?此字符表示二进制代码 174 或 10101110。
结果是"wq4="(通过查两个不同的在线base64编码网站得到的)
我了解 base64 编码系统的工作原理。对于 ASCII 字符,我可以获得正确的结果,但对于任何非 ASCII 字符,结果永远不会匹配。
我试过两种方法:
- 直接使用此字符的二进制文件 (10101110) 并将其分成 2 个 6 位块:101011 和 100000。对于 base64,它们对应于 "rg"
- 首先将 10101110 转换为 UTF-8,因此我有 2 个字节:11010101 和 10110000。然后我混合这两个字节并将它们分成 6 位的块:110101 011011 000000。对于 base64,它们对应于“1bA”。
我不知道如何处理非 ASCII 字符。通过对任何 ASCII 字符进行相同的计算,就可以了。
有谁知道我做错了什么吗?
Base64 将二进制数据编码为 ASCII 文本。 Unicode 字符 ®
在应用 Base64 之前可以用任何编码编码,但是 UTF-8 很方便,因为它可以编码任何 Unicode 码位。
问题中的错误是在转换为 UTF-8 时。这些位从右到左分配最低有效位,但从左到右分配最高有效位。
- 从
®
的 Unicode 代码点开始,即 U+00AE
。
- 转换为二进制:
10101110
- 代码点 U+0080 到 U+07FF 需要两字节 UTF-8 编码:
110xxxxx 10xxxxxx
。按如下方式分配位:11000010 10101110
- 将数据分组为 3 字节块。只有两个字节,所以完成后需要一个字节的填充。
- 重组为 6 位块:
110000 101010 111000
。
- 转换为十进制:
48 42 56
- 使用下面的 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
有人可以向我解释如何将字符串“®”编码为 base64(我只是选择了任何非 ASCII 字符来举例说明)吗?此字符表示二进制代码 174 或 10101110。
结果是"wq4="(通过查两个不同的在线base64编码网站得到的)
我了解 base64 编码系统的工作原理。对于 ASCII 字符,我可以获得正确的结果,但对于任何非 ASCII 字符,结果永远不会匹配。
我试过两种方法:
- 直接使用此字符的二进制文件 (10101110) 并将其分成 2 个 6 位块:101011 和 100000。对于 base64,它们对应于 "rg"
- 首先将 10101110 转换为 UTF-8,因此我有 2 个字节:11010101 和 10110000。然后我混合这两个字节并将它们分成 6 位的块:110101 011011 000000。对于 base64,它们对应于“1bA”。
我不知道如何处理非 ASCII 字符。通过对任何 ASCII 字符进行相同的计算,就可以了。
有谁知道我做错了什么吗?
Base64 将二进制数据编码为 ASCII 文本。 Unicode 字符 ®
在应用 Base64 之前可以用任何编码编码,但是 UTF-8 很方便,因为它可以编码任何 Unicode 码位。
问题中的错误是在转换为 UTF-8 时。这些位从右到左分配最低有效位,但从左到右分配最高有效位。
- 从
®
的 Unicode 代码点开始,即U+00AE
。 - 转换为二进制:
10101110
- 代码点 U+0080 到 U+07FF 需要两字节 UTF-8 编码:
110xxxxx 10xxxxxx
。按如下方式分配位:11000010 10101110 - 将数据分组为 3 字节块。只有两个字节,所以完成后需要一个字节的填充。
- 重组为 6 位块:
110000 101010 111000
。 - 转换为十进制:
48 42 56
- 使用下面的 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