Страница 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.
Именно с ним.
Если серьёзно - зачем хранить то, что нельзя посмотреть, отсортировать, отфильтровать и т.д.?
Кстати, хоть 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
Если бы система не работала в юникоде, то девица не могла бы набрать что угодно. При попытке скопипастить что-нибудь на юникоде, у нее знаки вопроса бы выскочили.