View Issue Details

IDProjectCategoryView StatusLast Update
0003123Far ManagerDescriptionspublic2015-11-29 01:23
ReporterVictorianAssigned To 
PrioritynormalSeverityminorReproducibilityalways
Status newResolutionopen 
Platformx64OSWindowsOS Version8.1
Product Version3.0 
Target VersionFixed in Version 
Summary0003123: Various reading file "descript.ion" programs Total Commander and FAR manager 3.0
DescriptionFAR produces replacement string delimiters in a multiline description (in bytes 0x0A 0x0D) to space characters, which store them in a file descript.ion. Accordingly, when reading the description of these delimiters are not restored.

This causes incompatibility with descriptions created in the program Total Commander. TC converts bytes 0x0A 0x0D otherwise, replacing them with "\n", and any "\" character on the dual character "\\". This allows you to restore the file description descript.ion multiline text. Such replacement is subject to certain rules (see http://jpsoft.com/ascii/descfile.txt) using a special byte 0x04, allows the program to recognize the rules of storage. The emergence of bytes 0x04 0xC2 end of the line entry in Descript.ion, note the method of storage in the multi-string delimiters description.
Steps To Reproduce1. Install a 30-day trial version of Total Commander here:
http://www.ghisler.com/amazons3.php

2. Select any file in the folder where the file is not Descript.ion. Press Ctrl+Z, and write a few lines of any poem, using line breaks.

3. Read the description given in the program FAR Manager 3.0.
Thus, instead of a few lines of text, see the line, separated by "\n", and at the end of the line non-printable byte codes 0x04 0xC2.
Additional Information1. About the use of additional data storage format in lines file Descript.ion see here:
http://jpsoft.com/ascii/descfile.txt
2. This is in Russian can be found here:
http://forum.farmanager.com/viewtopic.php?f=7&t=285&p=133862#p133862
3. Attached file Descript.ion, created in the program Total Commander.
TagsNo tags attached.
Build

Activities

Victorian

2015-11-25 20:59

reporter  

descript.ion (912 bytes)

DrKnS

2015-11-26 10:27

administrator   bugnote:0014080

Диар Рашэн гайз!

Иф йу кант дискрайб йор праблэм ин пропэр Инглиш - плиз, ду нат йуз Гугл Транслэйт, Промт ор ватэвер элс, итс хард то андерстэнд зат раббиш.
Ду нат тормэнт йорсэлф энд азерс, джаст йуз Рашэн, ви кан рид ит ту.

Сэнк йу вэри мач.

shmuel

2015-11-27 23:24

developer   bugnote:0014089

DrKnS, а вот теперь проблема: как пропустить *твой* текст через Google Translate.

Smitis

2015-11-27 23:41

reporter   bugnote:0014090

С какого перепугу 0xC2 стал non-printable? Очень даже принтабл. Осталось только с кодировкой разобраться.

Victorian

2015-11-28 10:10

reporter   bugnote:0014092

Last edited: 2015-11-28 14:43

View 18 revisions

С кодировкой разобраться проще.
Создал в Total Commander Descript.ion, открыл его в Notepad.exe и записал в UTF-8, в UTF-16.

Вот что было в ANSI
0000000000: 3F 3F 3F 3F 3F 3F 2E 70 │ 6E 67 20 20 20 20 20 20 ??????.png
0000000010: 44 65 73 63 72 69 70 74 │ 69 6F 6E 20 66 6F 72 20 Description for
0000000020: 22 3F 3F 3F 3F 3F 3F 22 │ 20 5C 6E 28 E3 F0 E5 F7 "??????" \n(греч
0000000030: E5 F1 EA E8 E5 20 F1 E8 │ EC E2 EE EB FB 29 04 C2 еские символы)♦В
0000000040: 0D 0A │ ♪◙

Вот что вижу в UTF-8 (текст ?????? заменил на греческий, как должно было быть)
0000000000: EF BB BF CE 95 CF 81 CF │ 81 CE B1 CF 84 CE B1 2E �››Ε›ρ›ρ›α›τ›α›.
0000000010: 70 6E 67 20 44 65 73 63 │ 72 69 70 74 69 6F 6E 20 png Description
0000000020: 66 6F 72 20 22 CE 95 CF │ 81 CF 81 CE B1 CF 84 CE for "Ε›ρ›ρ›α›τ›α
0000000030: B1 22 20 5C 6E 28 D0 B3 │ D1 80 D0 B5 D1 87 D0 B5 ›" \n(г›р›е›ч›е›
0000000040: D1 81 D0 BA D0 B8 D0 B5 │ 20 D1 81 D0 B8 D0 BC D0 с›к›и›е› с›и›м›в
0000000050: B2 D0 BE D0 BB D1 8B 29 │ 04 D0 92 0D 0A ›о›л›ы›)♦В›♪◙

Вот что вижу в UTF-16 (CP1200)
0000000000: FEFF 0395 03C1 03C1 │ 03B1 03C4 03B1 002E Ερρατα.
0000000010: 0070 006E 0067 0020 │ 0044 0065 0073 0063 png Desc
0000000020: 0072 0069 0070 0074 │ 0069 006F 006E 0020 ription
0000000030: 0066 006F 0072 0020 │ 0022 0395 03C1 03C1 for "Ερρ
0000000040: 03B1 03C4 03B1 0022 │ 0020 005C 006E 0028 ατα" \n(
0000000050: 0433 0440 0435 0447 │ 0435 0441 043A 0438 гречески
0000000060: 0435 0020 0441 0438 │ 043C 0432 043E 043B е символ
0000000070: 044B 0029 0004 0412 │ 000D 000A ы)♦В♪◙

Код 0x04 в UTF-8 сохраняется однобайтным, в UTF-16 дополняется игнорируемым нулевым байтом, который в старых программах принудительно завершает текстовую часть строки описания (правило ASCIZ).
Если рассуждать логически для текстового по-сути формата Descript.ion, то данные похоже придётся конвертировать из ASCII в UNICODE, чтобы можно было разбирать строки без проблем в любом текстовом редакторе, но потом опять преобразовывать в однобайтное представление, чтобы получить бинарные данные, - если они есть, но не в этом случае, тут лишь идентификатор без данных.
Однако, предложенный формат http://jpsoft.com/ascii/descfile.txt предполагает наличие за кодом 0x04 двоичных данных с кодами выше 0x1F, и этому лучше следовать. Следующий байт за 0x04 - просто идентификатор, а не текстовый символ, и это понятно по тому, что в однобайтной кодировке код идентификатора не привязан к определённой букве национального алфавита. В любом случае, за разъяснениями можно обратиться в компанию, создавшую этот стандарт.

P.S. Пробовал оставить идентификатор и данные к нему однобайтными, заменив вручную в HEX-редакторе 0x0D 0x92 на 0xC2, и такой файл прекрасно читают практически все редакторы, отмечая символ как некорректный, но прекрасно разбирая 0x0D 0x0A. Кроме того, это прекрасно воспринимает Total Commander, воспринимая текст как многострочный в файле с UTF-8, но при этом в тексте смотрятся характерной "абракадаброй" символы, которым соответствуют однобайтные коды выше 0x7F, и это хорошо. Можно за кодом 0x04 данные считать однобайтными бинарными, и это позволяет считывать файл Descript.ion в кодировке UTF-8 старыми программами как однобайтный, и корректно работать с ним. Эти символы можно копировать и вставлять в те программы, которые их будут воспринимать как UTF-8.
Однако, для этого следует изменить сам FAR Manager 3.0, чтобы за BOM-заголовком следовали байты 0x0D и 0x0A, то есть пустая строка, иначе первая запись о файле (первая строка) игнорируется по причине несовпадения имени файла (к имени файла слева добавлены три символа от BOM). Это имеет смысл сделать, так как всё равно нет полной совместимости с однобайтным Descript.ion вследствие интерпретации длиных имён файлов, начинающихся кавычками, но те файлы и так не воспринимаются старыми программами. Получается, что BOM с завершением строки - это тоже имя первой записи о файле, сообщающее о кодировке UNICODE. Предлагаю такой вид файла в "Description.7z".

Victorian

2015-11-28 11:11

reporter  

Description.7z (271 bytes)

Victorian

2015-11-28 11:22

reporter  

Description1.7z (311 bytes)

Victorian

2015-11-28 13:54

reporter   bugnote:0014093

Непонятно, почему после нажатия Ctrl+N в некоторых папках возвращаются короткие имена, а в других - нет. Например, в корне диска тут же вижу "PROGRA~2", и короткие в её подпапках, а после команды: CD "C:\1\UNICODE\" - в том же режиме не вижу отличия от длинных имён. "Description.7z", "Descript.ion(UnicodeBigEndian)", папка "wefwef wqeqwefwe WEFQWEFWEF.WEFWEQFWEF (WQED" не меняют своего вида.
Это глюк FAR, или в самой операционной системе что-то изменилось?

Victorian

2015-11-28 14:12

reporter   bugnote:0014094

При хранении описаний в однобайтной кодировке ANSI или OEM (при выбранных настройках FAR), ожидается, что для режима коротких имён файлов, и описания к файлам тоже будут отмечены короткими именами в "Descript.ion". Однако, этого почему-то не происходит. Если человек, пользуясь однобайтной кодировкой Descript.ion, на каком-либо из флоппи-носителей специально выбрал режим коротких имён, то логично допустить, что он желает сохранить описание с короткими именами (по крайней мере, те что он модифицирует). Это позволяет затем носитель прочитать в системе, где нет длинных имён, а используются только короткие. И наоборот, если при чтении Descript.ion не найден файл с записанным в нём коротким именем, но стоит режим длинных имён, то логично попробовать найти файл по короткому имени и работать с ним, но при записи описания (в том числе копировании/перемещении в другую папку) преобразовать имя файла в длинное в самом "Descript.ion", чтобы избежать этой бессмысленой работы в дальнейшем.

Smitis

2015-11-28 14:42

reporter   bugnote:0014095

Last edited: 2015-11-28 14:47

View 2 revisions

Файл descript.ion де-факто текстовый. Если делать так:
> Можно за кодом 0x04 данные считать однобайтными бинарными, и это позволяет считывать файл Descript.ion в кодировке UTF-8 старыми программами как однобайтный, и корректно работать с ним.
это уже будет не текстовый формат, а БИНАРНЫЙ. У меня есть утилиты, работающие с описаниями. И честно говоря изобретать какие-то особые способы чтения строк из файла миную библиотечные нет никакого желания. И уж тем более трахаться с этим символом в скриптовых языках (VBS, JS, PowerShell).

> Однако, предложенный формат http://jpsoft.com/ascii/descfile.txt [^] предполагает наличие за кодом 0x04 двоичных данных с кодами выше 0x1F, и этому лучше следовать.
Этот "формат" придуман когда юникода ещё не было. Сам tcc до сих пор использует OEM кодировки, а отличие от того же ТС использующего ANSI. Наследие тяжёлого прошлого, от которого надо избавляться.

> Кроме того, это прекрасно воспринимает Total Commander, воспринимая текст как многострочный в файле с UTF-8
TC не воспринимает unicod. Описание файла в первой строке descript.ion он просто не увидит, так как перед именем файла идёт BOM. Вы уже сами озвучили проблему. И это проблема ТС, а не ФАРа.

> Непонятно, почему после нажатия Ctrl+N в некоторых папках возвращаются короткие имена, а в других - нет.
Потому что у имён файлов могут быть короткие имена, а могут и не быть. Особенность NTFS.

Victorian

2015-11-28 15:27

reporter   bugnote:0014096

Last edited: 2015-11-28 15:45

View 6 revisions

Это проблема всех ранее созданных, и до сих пор используемых программ, а не только TC.
Всё же ради совместимости за BOM-кодом хорошо бы ставить байты 0x0D 0x0A, это даёт совместимость описания UTF-8 с любой старой программой с OEM/ANSI, потому как в следующей строке с её точки зрения будет первое имя файла без лишних добавлений слева от имени, мешающих сопоставлением с имеющимся на диске файлом.
Есть BOM - то программа, работающая с Descript.ion, записывает первую строку пустой, без имени файла. Пустые строки программами просто игнорируются, ибо там находится имя файла с нулевой длиной, которое не может быть найдено на диске.

При этом, если не использованы длинные имена и расширенные символы, то программа и пользователь не заметят отличия между OEM и UTF-8, а если есть двубайтные символы - то она будет их честно копировать в другой Descript.ion и передавать на экран консоли, что позволяет сохранить её вывод в файле с UNICODE (как добавление к существующему текстовому файлу в UTF-8).
Совместимость с ранее созданными Descript.ion в FAR не нарушается. Для скриптов не проблема игнорировать пустую строку (как впрочем, и завершающую пустую строку в Descript.ion).

И наоборот, при копировании/перемещении файлов другими программами, первая строка из Descript.ion теряется, если он был сохарнён в UTF-8, а программа работала с ним как с текстовым файлом в однобайтной кодировке. Это реальность, с которой следует считаться.

Ничего не имею против сопоставления идентификатора как текстового символа, это будет вполне логично, и не создаст никаких потенциальных проблем. Одну из них я уже увидел - редактор Notepad.exe заменяет пробелом символ с нулевым кодом. Хотелось бы редактировать Descript.ion текстовым редактором, не разрушая его внутренней структуры.
В TC уже задумались над поддержкой Descript.ion в UTF-16, и если в FAR будет сделано использование идентификатора ID как текстового символа, то в TC будет легче этому следовать в их реализации многострочного описания. Вопрос только в том, чтобы была возможность генерировать Descript.ion также в формате UTF-16 опцией в настройке, как это уже сделано для UTF-8.

Считаю, что в плане совместимости в TC многострочное описание реализовано довольно удачно, потому как не создаёт побочных эффектов при чтении символов "\n" и "\\" в обычном описании, если не предполагалось их многострочное использование в отсутствие идентификатора. Однако, с этими символами придётся столкнуться в описаниях, созданных пользователями Total Commander и XnViewMP, и корректная их поддержка необходима. В XnView появление таких описаний даже более вероятно, - как текстовый коментарий, созданный к фотографии.

Smitis

2015-11-28 18:17

reporter   bugnote:0014097

> Это проблема всех ранее созданных, и до сих пор используемых программ, а не только TC.
Огласите пжлст весь список программ, использующих способ идентификации вида 0x04 ID. Кстати, если посмотреть, что предлагает JPSoft в приведённом документе, то данные программ должны идти ПОСЛЕ этого кода, а не ДО. В этом плане ТС нарушает принятую конвенцию, размещая свои данные ДО кода.

В конце-то концов, если Гисляру совсем уж не похер на описания файлов, пусть тоже идёт на встречу.

Victorian

2015-11-28 19:16

reporter   bugnote:0014098

Данные программ как раз и находятся там: особый способ интерпретации символов \n, достаточно для этого идентификтора, а поле для самих данных нулевой длины.
Сам факт наличия идентификатора уже есть один бит данных.
Думаю, тут грех жаловаться...

В любом случае, введение нового способа интерпретации данных после символа 0x04 согласно этому документу требует согласования с JPSoft. Гисляр это сделал, кто мешает это сделать от имени сообщества FAR Manager team?..

Smitis

2015-11-29 00:12

reporter   bugnote:0014099

Last edited: 2015-11-29 01:23

View 2 revisions

> Сам факт наличия идентификатора уже есть один бит данных.
Ниасилил

> Гисляр это сделал
Сделал наоборот.

И ещё раз
> Огласите пжлст весь список программ, использующих способ идентификации вида 0x04 ID

Issue History

Date Modified Username Field Change
2015-11-25 20:59 Victorian New Issue
2015-11-25 20:59 Victorian File Added: descript.ion
2015-11-26 10:27 DrKnS Note Added: 0014080
2015-11-27 23:24 shmuel Note Added: 0014089
2015-11-27 23:41 Smitis Note Added: 0014090
2015-11-28 10:10 Victorian Note Added: 0014092
2015-11-28 10:12 Victorian Note Edited: 0014092 View Revisions
2015-11-28 10:14 Victorian Note Edited: 0014092 View Revisions
2015-11-28 10:21 Victorian Note Edited: 0014092 View Revisions
2015-11-28 10:58 Victorian Note Edited: 0014092 View Revisions
2015-11-28 11:11 Victorian File Added: Description.7z
2015-11-28 11:11 Victorian Note Edited: 0014092 View Revisions
2015-11-28 11:13 Victorian Note Edited: 0014092 View Revisions
2015-11-28 11:13 Victorian Note Edited: 0014092 View Revisions
2015-11-28 11:22 Victorian File Added: Description1.7z
2015-11-28 11:34 Victorian Note Edited: 0014092 View Revisions
2015-11-28 11:43 Victorian Note Edited: 0014092 View Revisions
2015-11-28 13:32 Victorian Note Edited: 0014092 View Revisions
2015-11-28 13:54 Victorian Note Added: 0014093
2015-11-28 14:12 Victorian Note Added: 0014094
2015-11-28 14:15 Victorian Note Edited: 0014092 View Revisions
2015-11-28 14:16 Victorian Note Edited: 0014092 View Revisions
2015-11-28 14:17 Victorian Note Edited: 0014092 View Revisions
2015-11-28 14:19 Victorian Note Edited: 0014092 View Revisions
2015-11-28 14:20 Victorian Note Edited: 0014092 View Revisions
2015-11-28 14:40 Victorian Note Edited: 0014092 View Revisions
2015-11-28 14:42 Smitis Note Added: 0014095
2015-11-28 14:43 Victorian Note Edited: 0014092 View Revisions
2015-11-28 14:47 Smitis Note Edited: 0014095 View Revisions
2015-11-28 15:27 Victorian Note Added: 0014096
2015-11-28 15:35 Victorian Note Edited: 0014096 View Revisions
2015-11-28 15:39 Victorian Note Edited: 0014096 View Revisions
2015-11-28 15:43 Victorian Note Edited: 0014096 View Revisions
2015-11-28 15:44 Victorian Note Edited: 0014096 View Revisions
2015-11-28 15:45 Victorian Note Edited: 0014096 View Revisions
2015-11-28 18:17 Smitis Note Added: 0014097
2015-11-28 19:16 Victorian Note Added: 0014098
2015-11-29 00:12 Smitis Note Added: 0014099
2015-11-29 01:23 Smitis Note Edited: 0014099 View Revisions