Страница 1 из 3

Юникод

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

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

ПОРТУГАЛИЯ, Vinhόs, Peso da Régua 5050-402, Portugal / Виньюш, Пезо да Регуа 5050-402
Тут, по идее, надо заменять на близкие английские буквы. Ничего в голову не пришло, кроме как открыть xml для редактирования перед загрузкой в базу данных. Если обезьянам дать гранату, то их ничто не остановит...

Юникод

Добавлено: 21 Апрель 2020, 19:02
vic7tar
Может быть, использовать NormalizeString(long NormForm = NormalizationKD, ...) для удаления диакритических знаков?
Придётся строку преобразовывать в UTF-16, в цикле пропускать каждый символ (2 байта) через NormalizeString(), исключать кирилсимволы с диакритикой (вот здесь нужна таблица исключений - ё, й и т.п.), и в конце декодировать в ANSI.
Проверил в VS, вроде работает.

Юникод

Добавлено: 21 Апрель 2020, 19:21
finsoftrz
Там надо не исключать, а заменять на что-то сходное по написанию. У меня разбор делается на vbscript, который генерится классом из приложения на кларионе. Когда был случай единичный, я отсекал регуляркой. На там в регулярке каждый код символа надо прописывать, слишком громоздко получается. Можно, наверно, как-то через таблицу соответствий и циклом...

Юникод

Добавлено: 21 Апрель 2020, 19:30
vic7tar
Было ό -> NormalizeString() -> станет o
Было ё -> NormalizeString() -> станет е
Чтобы ё не стало е, ё нужно поместить в таблицу исключений, т.е. в цикле пропускать её обработку.

Юникод

Добавлено: 21 Апрель 2020, 20:18
Игорь Столяров
finsoftrz писал(а): 20 Апрель 2020, 18:22 стали забивать наименование вин и адреса производителей с использованием юникода
Ну так видимо такие строки уже и надо просто хранить в юникоде и всё. Время пришло … ;)

Юникод

Добавлено: 21 Апрель 2020, 20:52
finsoftrz
Игорь Столяров писал(а): 21 Апрель 2020, 20:18
finsoftrz писал(а): 20 Апрель 2020, 18:22 стали забивать наименование вин и адреса производителей с использованием юникода
Ну так видимо такие строки уже и надо просто хранить в юникоде и всё. Время пришло … ;)
Кларион не поддерживает работу с юникодом, сами знаете. И, в данном случае, это откровенный бред. В одном названии русские, английские и португальские буквы. Хорошо, что иероглифы не воткнули.

Юникод

Добавлено: 21 Апрель 2020, 21:10
Игорь Столяров
finsoftrz писал(а): 21 Апрель 2020, 20:52 что иероглифы не воткнули.
Придёт партия сакэ - будут и иероглифы … ;)
finsoftrz писал(а): 21 Апрель 2020, 20:52 Кларион не поддерживает работу с юникодом
Почему ? Есть же типы строк для работы с UNUCODE. И Вам же не нужно по таким данным строить ключи и фильтры.
Тут скорее вопрос в сохранении полной исходной информации, например для сверки или печати.
Так, что для хранения вполне подойдёт обычный String c размером * 4.

Юникод

Добавлено: 21 Апрель 2020, 21:42
kreator
Игорь Столяров писал(а): 21 Апрель 2020, 21:10 Почему ? Есть же типы строк для работы с UNUCODE.
Именно с ним. :D
Если серьёзно - зачем хранить то, что нельзя посмотреть, отсортировать, отфильтровать и т.д.?
Кстати, хоть tps будет поддерживать USTRING?

Юникод

Добавлено: 21 Апрель 2020, 21:54
Игорь Столяров
kreator писал(а): 21 Апрель 2020, 21:42 нельзя посмотреть
Посмотреть - как раз-таки можно, если не средствами Clarion (хотя помню был такой снимок экрана в блоге SV), то WinAPI.
А вот с работой в БД (индексация, фильтрация) - сейчас нет. :(

Юникод

Добавлено: 22 Апрель 2020, 9:30
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


Юникод

Добавлено: 22 Апрель 2020, 9:38
finsoftrz
Еще натыкал допустимых символов:

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

RegObj.Pattern="[^A-Za-z0-9А-Яа-я_ -.,/\\\()[\]=!@&%*'+?|^~`\cI]"

Юникод

Добавлено: 22 Апрель 2020, 9:54
Игорь Столяров
Заранее извиняюсь, если не в тему (не юзаю я это), но разве вот это не работает ?
https://clarionsharp.com/blog/clarion-1 ... mentation/

Юникод

Добавлено: 22 Апрель 2020, 10:05
finsoftrz
Я не пробовал, это в 11 кларионе, у меня 6. Если думать вопрос с начала, а не с середины, то юникода в рассматриваемом случае не должно быть. Сто пудов, это какая-то девица скопипастила в систему, которая не запрещает этого делать. Продаваемые на территории страны товары должны иметь локализованное название. Либо "международное" на общепринятом английском языке. Помню, когда-то такое было. Регистрируешь новую фирму, в учредительных документах вписываешь два варианта реквизитов.
Прикинул, в чеке название вина на французком, а закуска на японском. И офигевшие глаза алкаша. :-)

Юникод

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

С алкашкой не работал, но могу провести аналогию с Меркурием. Правильным считается наименование, которое
указал производитель (ХС зарегистрировавший продукцию в системе), даже если он сделал это с орфографическими ошибками.
Далее в документах это наименование должно дублироваться без искажений. Как-то так. :)

Юникод

Добавлено: 22 Апрель 2020, 10:37
finsoftrz
Если бы система не работала в юникоде, то девица не могла бы набрать что угодно. При попытке скопипастить что-нибудь на юникоде, у нее знаки вопроса бы выскочили.