Парсинг формата CFP

Xamud

Новичок
Пытаюсь с помощью PHP внести коррективы в файл формата .cfp (Filler Pilot)
C английскими буквами все понятно, они не изменяются, а вот русские превращаются во что-то непонятное...
Подскажите что это за кодировка такая?

SFDсhг€µшд> UntitledForm Pilot Office 2.31Form Pilot Office 2.31 35р? ЧЈp=Љ @бz®Ga'@ $л% o$Мo€vѕ4лo oџc‘¬€vѕh{МЭААсhг€µшд>»=п]€яяяђ"Times New RomanђDоu›oTрj‡ђђ яяяя„N4Я Test text %.2f Text4вААсhг€µшд>†1и €яяяђ"Times New RomanђDоu›oTрj‡ђђ яяяя„N4Я "5AB>2K9 B5:AB %.2f Text5
Как видите, фраза "Test text" осталась неизменной, а вот фраза "Тестовый текст" превратилась в " 5 A B > 2 K 9 B 5 : A B .
 

Вложения

  • 5,9 KB Просмотры: 11

Вурдалак

Продвинутый новичок
tz-lom, тогда почему латинские буквы не затронуло? В UTF-16 минимальный размер символа занимает 2 байта.
 

tz-lom

Продвинутый новичок
Видимо там есть флаг переключения кодировки,или как то ещё
хз что в этом формате вообще упакованно , но текст который нужен ТС - в utf16le
 

Вурдалак

Продвинутый новичок
Просто у автора криво скопировалось видимо. Там похоже действительно 0x00 перед каждой латинской буквой, так что UTF-16, да.
 

Xamud

Новичок
Огромное спасибо за подсказку!
Вот только попытки декодировать код с помощью iconv(''UTF-16LE','UTF-8',$test); приводит к появлению китайских иероглифов.
 

Xamud

Новичок
Кстати, а что означают первые буквы файла: "SFD"?
Знаю что "PK" значит, файл представляет собой переименованный в другое расширение zip-архив, а о чем может говорить SFD?
 

tz-lom

Продвинутый новичок
о том что это CPF файл видимо , есть традиция ставить в бинарных файлах заголовок показывающий что это,но нет единого стандарта
 

tz-lom

Продвинутый новичок
потому что всегда нужно держать включённым вывод ошибок и ворнингов
PHP:
echo iconv('UTF-16LE','UTF-8//IGNORE',$test);
 

Xamud

Новичок
Опять проблема. Если перевести из UTF-16 в UTF-8, а затем обратно (даже без внесения изменений), то файл уменьшается на 0,01Кб. В результате, Fill Рilоt ругается на неизвестный формат файла и отказывается его открывать.
Сравнил оба файла Тотал Командером, тот показал, что в старом четыре раза встречается символ "4В". Что это ещё такое ума не приложу?
 

Вложения

tz-lom

Продвинутый новичок
1е - почитать что даёт //ignore
2е - работать с файлом в бинарном режиме,вырезать строку,менять её и вставлять обратно,не затрагивая окружающий текст
3е - это всё равно может не работать,например если там кодируется и длинна этой строки тоже
 

Xamud

Новичок
Действительно, кодируется ещё и длина строки: отдельные буквы заменяются без проблем, а вот при попытке увеличить файл перестает читаться пилотом.

Экспериментальным путем установил представление длинны строки:
Для русских символов:
ХААсhг€µшд>©MйZ == 1
ЦААсhг€µшд>©MйZ == 2
ЧААсhг€µшд>©MйZ == 3
ШААсhг€µшд>©MйZ == 4
Для английских:
ХААсhг€µшд>6n9 == 1
 ЦААсhг€µшд>6n9 == 2
Смешанный тип рус/англ:
ЦААсhг€µшд>6nѕн == 2

Таким образом, получается, что ©MйZ, 6n9, 6nѕн - тип данных
ХАА, ЦАА, ЧАА и т.д. - это длинна строки. Но в какой это кодировке/системе исчисления???
 

tz-lom

Продвинутый новичок
1е - работайте не с текстовым представлением а с бинарным, ваши ХАА безсмысленны
2е - думайте сами , наврядли здесь найдётся человек который будет реверсировать вам ваш файл просто так

по факту - длина строки может и не кодироваться численно , это может быть 0x0 0x0 в конце строки (так называемая С строка ака оканчивающаяся на ноль) , если же это не так,то логично было бы сперва проверить первые 2-4 байта перед строкой
 
Сверху