PDF 属性 字段中的奇怪编码
Strange encoding in PDF property fields
我对文档属性(标题、作者等)如何存储在 PDF 文件中有疑问。它看起来像 big-endian 字节顺序的 UTF-16。
因此 "MyName" 将被编码为:
FE FF 00 4D 00 79 00 4E 00 61 00 6D 00 65
然而,我运行进入这个应该有值FF 0D的字符“-”,但是我在它的位置找到了这些十六进制数字FF 5C 72
所以 "My-Name" 看起来像这样:
FE FF 00 4D 00 79 FF 5C 72 00 4E 00 61 00 6D 00 65
有人知道这里为什么用FF 5C 72吗?为什么其他地方都是 UTF-16 而只有 3 个字节?为什么这些值?
您没有正确解释所见:
FE FF
是序列的开始。
00
是一个 null
字节。
4D
在你的情况下很可能转化为 M
.
79
在你的情况下很可能转化为 y
.
4E
在你的情况下很可能转化为 N
.
61
在你的情况下很可能转化为 a
.
6D
在你的情况下很可能转化为 m
.
65
在您的情况下很可能转化为 e
.
将此与我的简单 ascii
命令行工具的输出进行比较,该工具将所有 ASCII 别名的列表打印为 table 及其 hex和 dec 编码:
$ ascii -h
Usage: ascii [-dxohv] [-t] [char-alias...]
-t = one-line output -d = Decimal table -o = octal table -x = hex table
-h = This help screen -v = version information
Prints all aliases of an ASCII character. Args may be chars, C \-escapes,
English names, ^-escapes, ASCII mnemonics, or numerics in decimal/octal/hex.
Dec Hex Dec Hex Dec Hex Dec Hex Dec Hex Dec Hex Dec Hex Dec Hex
0 00 NUL 16 10 DLE 32 20 48 30 0 64 40 @ 80 50 P 96 60 ` 112 70 p
1 01 SOH 17 11 DC1 33 21 ! 49 31 1 65 41 A 81 51 Q 97 61 a 113 71 q
2 02 STX 18 12 DC2 34 22 " 50 32 2 66 42 B 82 52 R 98 62 b 114 72 r
3 03 ETX 19 13 DC3 35 23 # 51 33 3 67 43 C 83 53 S 99 63 c 115 73 s
4 04 EOT 20 14 DC4 36 24 $ 52 34 4 68 44 D 84 54 T 100 64 d 116 74 t
5 05 ENQ 21 15 NAK 37 25 % 53 35 5 69 45 E 85 55 U 101 65 e 117 75 u
6 06 ACK 22 16 SYN 38 26 & 54 36 6 70 46 F 86 56 V 102 66 f 118 76 v
7 07 BEL 23 17 ETB 39 27 ' 55 37 7 71 47 G 87 57 W 103 67 g 119 77 w
8 08 BS 24 18 CAN 40 28 ( 56 38 8 72 48 H 88 58 X 104 68 h 120 78 x
9 09 HT 25 19 EM 41 29 ) 57 39 9 73 49 I 89 59 Y 105 69 i 121 79 y
10 0A LF 26 1A SUB 42 2A * 58 3A : 74 4A J 90 5A Z 106 6A j 122 7A z
11 0B VT 27 1B ESC 43 2B + 59 3B ; 75 4B K 91 5B [ 107 6B k 123 7B {
12 0C FF 28 1C FS 44 2C , 60 3C < 76 4C L 92 5C \ 108 6C l 124 7C |
13 0D CR 29 1D GS 45 2D - 61 3D = 77 4D M 93 5D ] 109 6D m 125 7D }
14 0E SO 30 1E RS 46 2E . 62 3E > 78 4E N 94 5E ^ 110 6E n 126 7E ~
15 0F SI 31 1F US 47 2F / 63 3F ? 79 4F O 95 5F _ 111 6F o 127 7F DEL
哦,惊喜!
这个 table 完全符合我上面的 "assumptions"。所以你可以放心地重新考虑你自己的 "UTF-16 in big-endian byte order".
这意味着对于您所讨论的十六进制数,FF 5C 72
?!?
好吧,查一下:FF
可以跳过,5C 72
是\r
...什么意思? (作为对 reader 的练习留下的答案)
我对文档属性(标题、作者等)如何存储在 PDF 文件中有疑问。它看起来像 big-endian 字节顺序的 UTF-16。
因此 "MyName" 将被编码为: FE FF 00 4D 00 79 00 4E 00 61 00 6D 00 65
然而,我运行进入这个应该有值FF 0D的字符“-”,但是我在它的位置找到了这些十六进制数字FF 5C 72
所以 "My-Name" 看起来像这样: FE FF 00 4D 00 79 FF 5C 72 00 4E 00 61 00 6D 00 65
有人知道这里为什么用FF 5C 72吗?为什么其他地方都是 UTF-16 而只有 3 个字节?为什么这些值?
您没有正确解释所见:
FE FF
是序列的开始。00
是一个null
字节。4D
在你的情况下很可能转化为M
.79
在你的情况下很可能转化为y
.4E
在你的情况下很可能转化为N
.61
在你的情况下很可能转化为a
.6D
在你的情况下很可能转化为m
.65
在您的情况下很可能转化为e
.
将此与我的简单 ascii
命令行工具的输出进行比较,该工具将所有 ASCII 别名的列表打印为 table 及其 hex和 dec 编码:
$ ascii -h
Usage: ascii [-dxohv] [-t] [char-alias...]
-t = one-line output -d = Decimal table -o = octal table -x = hex table
-h = This help screen -v = version information
Prints all aliases of an ASCII character. Args may be chars, C \-escapes,
English names, ^-escapes, ASCII mnemonics, or numerics in decimal/octal/hex.
Dec Hex Dec Hex Dec Hex Dec Hex Dec Hex Dec Hex Dec Hex Dec Hex
0 00 NUL 16 10 DLE 32 20 48 30 0 64 40 @ 80 50 P 96 60 ` 112 70 p
1 01 SOH 17 11 DC1 33 21 ! 49 31 1 65 41 A 81 51 Q 97 61 a 113 71 q
2 02 STX 18 12 DC2 34 22 " 50 32 2 66 42 B 82 52 R 98 62 b 114 72 r
3 03 ETX 19 13 DC3 35 23 # 51 33 3 67 43 C 83 53 S 99 63 c 115 73 s
4 04 EOT 20 14 DC4 36 24 $ 52 34 4 68 44 D 84 54 T 100 64 d 116 74 t
5 05 ENQ 21 15 NAK 37 25 % 53 35 5 69 45 E 85 55 U 101 65 e 117 75 u
6 06 ACK 22 16 SYN 38 26 & 54 36 6 70 46 F 86 56 V 102 66 f 118 76 v
7 07 BEL 23 17 ETB 39 27 ' 55 37 7 71 47 G 87 57 W 103 67 g 119 77 w
8 08 BS 24 18 CAN 40 28 ( 56 38 8 72 48 H 88 58 X 104 68 h 120 78 x
9 09 HT 25 19 EM 41 29 ) 57 39 9 73 49 I 89 59 Y 105 69 i 121 79 y
10 0A LF 26 1A SUB 42 2A * 58 3A : 74 4A J 90 5A Z 106 6A j 122 7A z
11 0B VT 27 1B ESC 43 2B + 59 3B ; 75 4B K 91 5B [ 107 6B k 123 7B {
12 0C FF 28 1C FS 44 2C , 60 3C < 76 4C L 92 5C \ 108 6C l 124 7C |
13 0D CR 29 1D GS 45 2D - 61 3D = 77 4D M 93 5D ] 109 6D m 125 7D }
14 0E SO 30 1E RS 46 2E . 62 3E > 78 4E N 94 5E ^ 110 6E n 126 7E ~
15 0F SI 31 1F US 47 2F / 63 3F ? 79 4F O 95 5F _ 111 6F o 127 7F DEL
哦,惊喜!
这个 table 完全符合我上面的 "assumptions"。所以你可以放心地重新考虑你自己的 "UTF-16 in big-endian byte order".
这意味着对于您所讨论的十六进制数,FF 5C 72
?!?
好吧,查一下:FF
可以跳过,5C 72
是\r
...什么意思? (作为对 reader 的练习留下的答案)