SASGIS - SAS.Планета
View Issue Details
0002883SAS.Планета[All Projects] Хотелкаpublic30-10-2015 14:1504-11-2015 08:50
vdemidov 
zed 
normalminoralways
resolvedfixed 
151010 
151111151111 
0002883: Проблемы с юникодом при обработке событий WMCopyData
Сейчас данные переданные через WMCopyData трактуются как AnsiString. Но там могут быть имена файлов для импорта, а также имя и описание метки для вставки в базу. А это совсем не обязательно AnsiString. Предлагаю при получении проверять BOM так же как и при открытии текстовых файлов.
юникод
child of 0002166resolved zed Переход на версию Delphi с полной поддержкой юникода 
Issue History
30-10-2015 14:15vdemidovNew Issue
30-10-2015 14:16vdemidovStatusnew => confirmed
30-10-2015 14:16vdemidovTag Attached: юникод
30-10-2015 14:18vdemidovRelationship addedchild of 0002166
30-10-2015 14:31zedNote Added: 0016669
30-10-2015 14:34vdemidovNote Added: 0016670
02-11-2015 14:58zedNote Added: 0016685
02-11-2015 14:58zedStatusconfirmed => resolved
02-11-2015 14:58zedFixed in Version => 151111
02-11-2015 14:58zedResolutionopen => fixed
02-11-2015 14:58zedAssigned To => zed
03-11-2015 08:51vdemidovNote Added: 0016694
03-11-2015 08:51vdemidovAssigned Tozed =>
03-11-2015 08:51vdemidovStatusresolved => confirmed
03-11-2015 08:55vdemidovResolutionfixed => reopened
03-11-2015 10:09zedNote Added: 0016696
03-11-2015 10:52vdemidovNote Added: 0016700
03-11-2015 10:57zedNote Added: 0016702
03-11-2015 11:01vdemidovNote Added: 0016703
03-11-2015 11:03zedNote Added: 0016704
03-11-2015 11:12vdemidovNote Added: 0016705
03-11-2015 11:14vdemidovNote Added: 0016706
03-11-2015 11:16vdemidovNote Added: 0016707
03-11-2015 19:39vdemidovNote Added: 0016714
03-11-2015 19:41zedNote Added: 0016715
03-11-2015 19:47vdemidovNote Added: 0016716
04-11-2015 08:50vdemidovStatusconfirmed => resolved
04-11-2015 08:50vdemidovResolutionreopened => fixed
04-11-2015 08:50vdemidovAssigned To => zed

Notes
(0016669)
zed   
30-10-2015 14:31   
Не нравится мне этот BOM. Он может и удобен с точки зрения доработки SAS, но вот в использовании он не удобен. Что мешает добавить ключ --utf8 при передаче параметров? Тем более, что это же влияет и на обработку параметров командной строки. Или там предлагаешь оставить ansi?
(0016670)
vdemidov   
30-10-2015 14:34   
В юникодной версии параметры командной строки и так уже юникодные, или я не прав?
Можно и ключ добавить. Я как-то не догадался. Это будет удобнее.
(0016685)
zed   
02-11-2015 14:58   
Добавил ключ и сделал обработку сообщений в UTF-8.
(0016694)
vdemidov   
03-11-2015 08:51   
Не, обработку этого ключа нужно делать на уровне TCmdLineArgProcessor, а наружу выставить максимум перегрузку метода Process принимающую AnsiString
(0016696)
zed   
03-11-2015 10:09   
Не, тот парсер работает со строками, так что там не получится. Конвертировать нужно до него. Я конечно могу перегрузить метод Process и написать там точно тот же код, что и сейчас в Main, только сути это особо не изменит.

Согласен, что простой Pos я зря заюзал, надо более аккуратно искать ключик в строке, например адаптировать FindCmdLineSwitch для ансишных строк или взять её из Alcinoe, если оно там есть.
(0016700)
vdemidov   
03-11-2015 10:52   
А что мешает. Utf-8 прекрасно без потерь конвертируется в строку. Скармливаем все что пришло парсеру. Проверяем ключ utf-8. Если он есть, то все ключи в которых могут быть юникодные символы (названия меток, имена файлов) перед использованием прогоняем через декодер utf-8.
Опять же вся логика прячется в парсере и не отсвечивает наружу.
(0016702)
zed   
03-11-2015 10:57   
>Utf-8 прекрасно без потерь конвертируется в строку.
Точно? Это всё же перекодировка и она будет использовать текущую локаль.
(0016703)
vdemidov   
03-11-2015 11:01   
>>Utf-8 прекрасно без потерь конвертируется в строку.
>Точно? Это всё же перекодировка и она будет использовать текущую локаль.
Не точно, нужно проверить. Но даже если нет, то для этого можно сделать перегруженную версию Process для AnsiString и там преобразовывать без потерь.
(0016704)
zed   
03-11-2015 11:03   
>и там преобразовывать без потерь
Как?
(0016705)
vdemidov   
03-11-2015 11:12   
>>и там преобразовывать без потерь
>Как?
Ладно, нужно подумать, но в любом случае это не в главной форме надо делать, а где-то уже в парсере.
(0016706)
vdemidov   
03-11-2015 11:14   
А, понял. Преобразование AnsiString -> WideString -> AnsiString должно быть тождественным для любой строки. Utf-8 ничуть не хуже любой другой.
(0016707)
vdemidov   
03-11-2015 11:16   
Так что просто конвертим в String, обрабатываем как нам нравится. Если нужно получить строку с возможным наличием юникода и взведен флаг Utf-8, то конвертим в AnsiString и вызываем UTF8DEcode
(0016714)
vdemidov   
03-11-2015 19:39   
Теперь будет проблема с символами не из основной локали при передаче их параметрами в юникодную версию через командную строку
(0016715)
zed   
03-11-2015 19:41   
Нет, параметры командной строки обрабатываются перегруженной функцией.
(0016716)
vdemidov   
03-11-2015 19:47   
Ой. Точно. Прогнал.