【问题标题】:Strange encoding in PDF property fieldsPDF 属性字段中的奇怪编码
【发布时间】:2015-04-10 22:09:23
【问题描述】:

我有一个关于文档属性(标题、作者等)如何存储在 PDF 文件中的问题。它看起来像大端字节序的 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 个字节?为什么是这些值?

【问题讨论】:

    标签: pdf encoding binary-data utf-16


    【解决方案1】:

    你没有正确解释你所看到的:

    1. FE FF 是序列的开始。
    2. 00 是一个 null 字节。
    3. 4D 在您的情况下很可能转换为 M
    4. 79 在您的情况下很可能转换为 y
    5. 4E 在您的情况下很可能转换为 N
    6. 61 在您的情况下很可能转换为 a
    7. 6D 在您的情况下很可能转换为 m
    8. 65 在您的情况下很可能转换为 e

    将此与我的简单 ascii 命令行工具的输出进行比较,该工具将所有 ASCII 别名的列表打印为带有 hexdec 编码的表格:

    $ 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
    

    哦,惊喜!

    这张表完全符合我上面的“假设”。因此,您可以省心地重新考虑自己的“UTF-16 in big-endian byte order”

    这意味着您的十六进制数,FF 5C 72?!?

    好吧,查一下:FF 你可以跳过,5C 72\r...这意味着什么? (答案留给读者练习)

    【讨论】:

    • FE FF 是 Big-endian (BE. 同样,FF FE 表示 Little-Endian) 的字节顺序标记 (BOM)。 00 4D 是 UTF-16BE 中“M”的编码。无论如何,我想通了。 0A 和 0D 是 PDF 流中的特殊字符,因此它们的所有出现都替换为 \r 和 \n。无论如何,既然你是唯一一个回复的人,那么你就是答案。
    • @ChuBun:你可以假设我知道 BE 和 FE 的 BOM。但是在解释像你这样的 PDF 的 /Info 字典中的字符串时,不需要求助于它......
    • @ChuBun 不管怎样,既然你是唯一回复的人,那么你就是答案 - 你不应该仅仅因为它是当时只有一个。
    • @mkl:如果 OP 需要,可以随时撤回“接受”,并且可以将其分配给一个新的、更好的、更完整的答案。 (根据我的经验,不能简单地撤回“赞成票”——如果您尝试这样做,它总是会转换为“反对票”。我觉得这有点过头了……)
    • @Kurt 是的,可以撤回。但我仍然认为一个公认的答案应该表明“没有其他人想出什么”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    相关资源
    最近更新 更多