2015-04-10 3 views
2

У меня возник вопрос о том, как свойства документа (название, автор и т. Д.) Хранятся в файле PDF. Он выглядит как UTF-16 в порядке байтов байтов.Странное кодирование в полях свойств PDF

Таким образом, "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 используется здесь? Почему 3 байта, когда везде есть UTF-16? Почему эти ценности?

ответ

0

Вы не правильно интерпретировать то, что вы видите:

  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 псевдонимов в виде таблицы с их шестнадцатеричным и Декабрь кодировок:

$ 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 

Oh, сюрприз!

Этот стол отлично соответствует моим «предположениям» сверху. Таким образом, вы можете с уверенностью рассмотреть свои собственные около «UTF-16 в бай-ином порядке».

И это означает, что ваш гексагонный номер указан, FF 5C 72?!?

Хорошо, посмотрите: FF вы можете пропустить, 5C 72 is \r ... Что означает? (Ответ слева как упражнение для читателя)

+1

FE FF - это маркер байтов (BOM) для Big-Endian (BE. Аналогично, FF FE означает Little-Endian). 00 4D - это кодировка для «M» в UTF-16BE. Во всяком случае, я понял это. 0A и 0D являются специальными символами в потоке PDF, поэтому все их вхождения заменяются на \ r и \ n. Во всяком случае, поскольку вы единственный, кто мог ответить, ваш ответ. –

+0

@ChuBun: Вы можете утверждать, что я знаю спецификацию для BE и FE.Но нет необходимости прибегать к нему при интерпретации строк в словаре '/ Info' в формате PDF, таком как ваш ... –

+0

@ChuBun * Во всяком случае, поскольку вы единственный, кто должен ответить, ваш ответ - вы должны «Я принимаю ответ после столь короткого времени просто потому, что он единственный в то время. – mkl

Смежные вопросы