Юникод

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4549
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Юникод

Сообщение finsoftrz »

Вот, столкнулся. В Егаис некоторые импортеры стали забивать наименование вин и адреса производителей с использованием юникода. Для примера:

Код: Выделить всё

ПОРТУГАЛИЯ, Vinhόs, Peso da Régua 5050-402, Portugal / Виньюш, Пезо да Регуа 5050-402
Тут, по идее, надо заменять на близкие английские буквы. Ничего в голову не пришло, кроме как открыть xml для редактирования перед загрузкой в базу данных. Если обезьянам дать гранату, то их ничто не остановит...
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
vic7tar
Ветеран
Сообщения: 365
Зарегистрирован: 09 Февраль 2017, 20:12

Юникод

Сообщение vic7tar »

Может быть, использовать NormalizeString(long NormForm = NormalizationKD, ...) для удаления диакритических знаков?
Придётся строку преобразовывать в UTF-16, в цикле пропускать каждый символ (2 байта) через NormalizeString(), исключать кирилсимволы с диакритикой (вот здесь нужна таблица исключений - ё, й и т.п.), и в конце декодировать в ANSI.
Проверил в VS, вроде работает.
C10, Win10x64
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4549
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Юникод

Сообщение finsoftrz »

Там надо не исключать, а заменять на что-то сходное по написанию. У меня разбор делается на vbscript, который генерится классом из приложения на кларионе. Когда был случай единичный, я отсекал регуляркой. На там в регулярке каждый код символа надо прописывать, слишком громоздко получается. Можно, наверно, как-то через таблицу соответствий и циклом...
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
vic7tar
Ветеран
Сообщения: 365
Зарегистрирован: 09 Февраль 2017, 20:12

Юникод

Сообщение vic7tar »

Было ό -> NormalizeString() -> станет o
Было ё -> NormalizeString() -> станет е
Чтобы ё не стало е, ё нужно поместить в таблицу исключений, т.е. в цикле пропускать её обработку.
C10, Win10x64
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Юникод

Сообщение Игорь Столяров »

finsoftrz писал(а): 20 Апрель 2020, 18:22 стали забивать наименование вин и адреса производителей с использованием юникода
Ну так видимо такие строки уже и надо просто хранить в юникоде и всё. Время пришло … ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4549
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Юникод

Сообщение finsoftrz »

Игорь Столяров писал(а): 21 Апрель 2020, 20:18
finsoftrz писал(а): 20 Апрель 2020, 18:22 стали забивать наименование вин и адреса производителей с использованием юникода
Ну так видимо такие строки уже и надо просто хранить в юникоде и всё. Время пришло … ;)
Кларион не поддерживает работу с юникодом, сами знаете. И, в данном случае, это откровенный бред. В одном названии русские, английские и португальские буквы. Хорошо, что иероглифы не воткнули.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Юникод

Сообщение Игорь Столяров »

finsoftrz писал(а): 21 Апрель 2020, 20:52 что иероглифы не воткнули.
Придёт партия сакэ - будут и иероглифы … ;)
finsoftrz писал(а): 21 Апрель 2020, 20:52 Кларион не поддерживает работу с юникодом
Почему ? Есть же типы строк для работы с UNUCODE. И Вам же не нужно по таким данным строить ключи и фильтры.
Тут скорее вопрос в сохранении полной исходной информации, например для сверки или печати.
Так, что для хранения вполне подойдёт обычный String c размером * 4.
За теми кто отстал - не возвращаться. (С) Кодекс
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Юникод

Сообщение kreator »

Игорь Столяров писал(а): 21 Апрель 2020, 21:10 Почему ? Есть же типы строк для работы с UNUCODE.
Именно с ним. :D
Если серьёзно - зачем хранить то, что нельзя посмотреть, отсортировать, отфильтровать и т.д.?
Кстати, хоть tps будет поддерживать USTRING?
We are hard at work… for you. :)
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Юникод

Сообщение Игорь Столяров »

kreator писал(а): 21 Апрель 2020, 21:42 нельзя посмотреть
Посмотреть - как раз-таки можно, если не средствами Clarion (хотя помню был такой снимок экрана в блоге SV), то WinAPI.
А вот с работой в БД (индексация, фильтрация) - сейчас нет. :(
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4549
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Юникод

Сообщение finsoftrz »

Как вариант решения, сделать замену символов юникода на ?. Видел подобное решение. Фрагменты генерируемого кода на vbscript выглядят так.

Код: Выделить всё

Set RegObj = New RegExp
RegObj.Global=true
RegObj.IgnoreCase=false
RegObj.Multiline=false
RegObj.Pattern="[^A-Za-z0-9А-Яа-я_ -.,/\\\()']"
...
   SET wb_Product_pref_Producer_oref_FO_oref_FullName = Elem.SelectSingleNode("wb:Product/pref:Producer/oref:FO/oref:FullName")
   if not wb_Product_pref_Producer_oref_FO_oref_FullName is Nothing then
      mytext=RegObj.Replace(wb_Product_pref_Producer_oref_FO_oref_FullName.text,"?")
      outFile.WriteLine "wb:Product/pref:Producer/oref:FO/oref:FullName=" & mytext
   end if

C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4549
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Юникод

Сообщение finsoftrz »

Еще натыкал допустимых символов:

Код: Выделить всё

RegObj.Pattern="[^A-Za-z0-9А-Яа-я_ -.,/\\\()[\]=!@&%*'+?|^~`\cI]"
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Юникод

Сообщение Игорь Столяров »

Заранее извиняюсь, если не в тему (не юзаю я это), но разве вот это не работает ?
https://clarionsharp.com/blog/clarion-1 ... mentation/
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4549
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Юникод

Сообщение finsoftrz »

Я не пробовал, это в 11 кларионе, у меня 6. Если думать вопрос с начала, а не с середины, то юникода в рассматриваемом случае не должно быть. Сто пудов, это какая-то девица скопипастила в систему, которая не запрещает этого делать. Продаваемые на территории страны товары должны иметь локализованное название. Либо "международное" на общепринятом английском языке. Помню, когда-то такое было. Регистрируешь новую фирму, в учредительных документах вписываешь два варианта реквизитов.
Прикинул, в чеке название вина на французком, а закуска на японском. И офигевшие глаза алкаша. :-)
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Юникод

Сообщение Игорь Столяров »

finsoftrz писал(а): 22 Апрель 2020, 10:05 Если думать вопрос с начала, а не с середины
то становится понятно, что девица может набрать что угодно, и если бы сама система не работала в UNICODE,
то Вы бы получили на выходе из неё кракозябры (как раньше было с почтовыми сообщениями).

С алкашкой не работал, но могу провести аналогию с Меркурием. Правильным считается наименование, которое
указал производитель (ХС зарегистрировавший продукцию в системе), даже если он сделал это с орфографическими ошибками.
Далее в документах это наименование должно дублироваться без искажений. Как-то так. :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4549
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Юникод

Сообщение finsoftrz »

Если бы система не работала в юникоде, то девица не могла бы набрать что угодно. При попытке скопипастить что-нибудь на юникоде, у нее знаки вопроса бы выскочили.
C6/C11, ШВС, tps/btrieve.
Ответить