View Issue Details

IDProjectCategoryView StatusLast Update
0002883SAS.ПланетаХотелка / Feature requestpublic04-11-2015 08:50
Reportervdemidov Assigned Tozed  
PrioritynormalSeverityminorReproducibilityalways
Status resolvedResolutionfixed 
Product Version151010 
Target Version151111Fixed in Version151111 
Summary0002883: Проблемы с юникодом при обработке событий WMCopyData
DescriptionСейчас данные переданные через WMCopyData трактуются как AnsiString. Но там могут быть имена файлов для импорта, а также имя и описание метки для вставки в базу. А это совсем не обязательно AnsiString. Предлагаю при получении проверять BOM так же как и при открытии текстовых файлов.
Tagsюникод

Relationships

child of 0002166 resolvedzed Переход на версию Delphi с полной поддержкой юникода 

Activities

zed

30-10-2015 14:31

manager   ~0016669

Не нравится мне этот BOM. Он может и удобен с точки зрения доработки SAS, но вот в использовании он не удобен. Что мешает добавить ключ --utf8 при передаче параметров? Тем более, что это же влияет и на обработку параметров командной строки. Или там предлагаешь оставить ansi?

vdemidov

30-10-2015 14:34

manager   ~0016670

В юникодной версии параметры командной строки и так уже юникодные, или я не прав?
Можно и ключ добавить. Я как-то не догадался. Это будет удобнее.

zed

02-11-2015 14:58

manager   ~0016685

Добавил ключ и сделал обработку сообщений в UTF-8.

vdemidov

03-11-2015 08:51

manager   ~0016694

Не, обработку этого ключа нужно делать на уровне TCmdLineArgProcessor, а наружу выставить максимум перегрузку метода Process принимающую AnsiString

zed

03-11-2015 10:09

manager   ~0016696

Не, тот парсер работает со строками, так что там не получится. Конвертировать нужно до него. Я конечно могу перегрузить метод Process и написать там точно тот же код, что и сейчас в Main, только сути это особо не изменит.

Согласен, что простой Pos я зря заюзал, надо более аккуратно искать ключик в строке, например адаптировать FindCmdLineSwitch для ансишных строк или взять её из Alcinoe, если оно там есть.

vdemidov

03-11-2015 10:52

manager   ~0016700

А что мешает. Utf-8 прекрасно без потерь конвертируется в строку. Скармливаем все что пришло парсеру. Проверяем ключ utf-8. Если он есть, то все ключи в которых могут быть юникодные символы (названия меток, имена файлов) перед использованием прогоняем через декодер utf-8.
Опять же вся логика прячется в парсере и не отсвечивает наружу.

zed

03-11-2015 10:57

manager   ~0016702

>Utf-8 прекрасно без потерь конвертируется в строку.
Точно? Это всё же перекодировка и она будет использовать текущую локаль.

vdemidov

03-11-2015 11:01

manager   ~0016703

>>Utf-8 прекрасно без потерь конвертируется в строку.
>Точно? Это всё же перекодировка и она будет использовать текущую локаль.
Не точно, нужно проверить. Но даже если нет, то для этого можно сделать перегруженную версию Process для AnsiString и там преобразовывать без потерь.

zed

03-11-2015 11:03

manager   ~0016704

>и там преобразовывать без потерь
Как?

vdemidov

03-11-2015 11:12

manager   ~0016705

>>и там преобразовывать без потерь
>Как?
Ладно, нужно подумать, но в любом случае это не в главной форме надо делать, а где-то уже в парсере.

vdemidov

03-11-2015 11:14

manager   ~0016706

А, понял. Преобразование AnsiString -> WideString -> AnsiString должно быть тождественным для любой строки. Utf-8 ничуть не хуже любой другой.

vdemidov

03-11-2015 11:16

manager   ~0016707

Так что просто конвертим в String, обрабатываем как нам нравится. Если нужно получить строку с возможным наличием юникода и взведен флаг Utf-8, то конвертим в AnsiString и вызываем UTF8DEcode

vdemidov

03-11-2015 19:39

manager   ~0016714

Теперь будет проблема с символами не из основной локали при передаче их параметрами в юникодную версию через командную строку

zed

03-11-2015 19:41

manager   ~0016715

Нет, параметры командной строки обрабатываются перегруженной функцией.

vdemidov

03-11-2015 19:47

manager   ~0016716

Ой. Точно. Прогнал.

Issue History

Date Modified Username Field Change
30-10-2015 14:15 vdemidov New Issue
30-10-2015 14:16 vdemidov Status new => confirmed
30-10-2015 14:16 vdemidov Tag Attached: юникод
30-10-2015 14:18 vdemidov Relationship added child of 0002166
30-10-2015 14:31 zed Note Added: 0016669
30-10-2015 14:34 vdemidov Note Added: 0016670
02-11-2015 14:58 zed Note Added: 0016685
02-11-2015 14:58 zed Status confirmed => resolved
02-11-2015 14:58 zed Fixed in Version => 151111
02-11-2015 14:58 zed Resolution open => fixed
02-11-2015 14:58 zed Assigned To => zed
03-11-2015 08:51 vdemidov Note Added: 0016694
03-11-2015 08:51 vdemidov Assigned To zed =>
03-11-2015 08:51 vdemidov Status resolved => confirmed
03-11-2015 08:55 vdemidov Resolution fixed => reopened
03-11-2015 10:09 zed Note Added: 0016696
03-11-2015 10:52 vdemidov Note Added: 0016700
03-11-2015 10:57 zed Note Added: 0016702
03-11-2015 11:01 vdemidov Note Added: 0016703
03-11-2015 11:03 zed Note Added: 0016704
03-11-2015 11:12 vdemidov Note Added: 0016705
03-11-2015 11:14 vdemidov Note Added: 0016706
03-11-2015 11:16 vdemidov Note Added: 0016707
03-11-2015 19:39 vdemidov Note Added: 0016714
03-11-2015 19:41 zed Note Added: 0016715
03-11-2015 19:47 vdemidov Note Added: 0016716
04-11-2015 08:50 vdemidov Status confirmed => resolved
04-11-2015 08:50 vdemidov Resolution reopened => fixed
04-11-2015 08:50 vdemidov Assigned To => zed
08-08-2025 13:24 zed Category Хотелка => Хотелка / Feature request