Страница 216 из 219
Clarion 11-12
Добавлено: 13 Январь 2026, 19:59
finsoftrz
Игорь Столяров писал(а): 12 Январь 2026, 19:27
Мне вообще не нравится, что USTRING имеет размер. Это просто очередное натягивание совы на глобус ...
Да, я тоже думаю, что это ошибочный подход. Длину у STRING понять можно, это позволяет быстро выделять память под фиксированное количество байт. В случае с юникодом на один символ может приходиться разное количество байт, поэтому строка может иметь переменную длину. Размерность ustring можно оставить в синтаксисе языка для обратной совместимости, как это сделано в sqlite. То есть, мы там можем задать myfield char(100), но на самом деле поле будет содержать столько байт, сколько туда записали.
Судя по тому, что написал RZ, он решил, что пока сойдет 2 байта на символ. Но все равно придется переходить на строки с переменной длиной, заново переписывая соответствующий код в компиляторе и рантайме.
Clarion 11-12
Добавлено: 13 Январь 2026, 20:27
kreator
Дед Пахом писал(а): 12 Январь 2026, 23:40
Драйвер (в теории) должен преобразовывать строку UTF-16 в UTF-8 на лету, прозрачно для нас. То есть к примеру есть таблица
Код: Выделить всё
MyFile FILE, DRIVER...
Record RECORD
Id LONG
Name USTRING
END
то ADD(MyFile) должен корректно передать юникод на сервер, в нужной кодировке.
А зачем нужны эти преобразования? И на сервер, и с сервера? Такой подход в других ЯП?
Clarion 11-12
Добавлено: 13 Январь 2026, 20:29
Игорь Столяров
finsoftrz писал(а): 13 Январь 2026, 19:59
Судя по тому, что написал RZ, он решил, что пока сойдет 2 байта на символ.
Я вот тоже сижу и думаю, как бы сделать ТС ПИоТ, что бы меня перестали о нём спрашивать и просто от .. стали в общем.
Все мы немного Robert Zaunere ...

Clarion 11-12
Добавлено: 13 Январь 2026, 20:34
finsoftrz
Игорь Столяров писал(а): 13 Январь 2026, 20:29
finsoftrz писал(а): 13 Январь 2026, 19:59
Судя по тому, что написал RZ, он решил, что пока сойдет 2 байта на символ.
Я вот тоже сижу и думаю, как бы сделать ТС ПИоТ, что бы меня перестали о нём спрашивать и просто от .. стали в общем.
Все мы немного Robert Zaunere ...
А Вы прошли сертификацию по ПИоТ? Тут одна птичка напела, что у них процесс занял пару недель.
Clarion 11-12
Добавлено: 13 Январь 2026, 20:37
Дед Пахом
kreator писал(а): 13 Январь 2026, 20:27
А зачем нужны эти преобразования? И на сервер, и с сервера?
Наверно, чтобы на сервере и клиенте данные совпадали.
Clarion 11-12
Добавлено: 13 Январь 2026, 22:47
kreator
Дед Пахом писал(а): 13 Январь 2026, 20:37
kreator писал(а): 13 Январь 2026, 20:27
А зачем нужны эти преобразования? И на сервер, и с сервера?
Наверно, чтобы на сервере и клиенте данные совпадали.
А Microsoft принципиально UTF-8 не хочет воспринимать? Все данные на клиенте должны быть в UTF-16?
В качестве примера создаю текстовый файл в UTF-8 блокнотом. Снова его открываю. Копирую содержимое. И определяю кодировку скопированного в онлайне. Показывает, что UTF-8. Т.е. блокнот может работать с UTF-8. Зачем UTF-16 на клиенте, если в БД UTF-8?
Clarion 11-12
Добавлено: 13 Январь 2026, 22:51
Дед Пахом
Чё ты ко мне-то привязался? Я на грека похож? Мне лично пофигу как они юникод реализовали.
Clarion 11-12
Добавлено: 13 Январь 2026, 23:20
Игорь Столяров
Если интересно разобраться в вопросе, вот здесь хорошее стартовое описание.
https://www.interface.ru/home.asp?artid=6041
Интересный момент:
Код: Выделить всё
Предыдущие версии СУБД Oracle и языка Java также используют формат UCS-2 и не способны распознавать суррогатные символы.
Корпорация Oracle ввела поддержку Юникода в качестве набора символов для баз данных начиная с версии Oracle 7.
В настоящее время СУБД Oracle поддерживает два метода хранения данных в формате Юникод:
первый - кодировка UTF-8 для символьных типов данных CHAR и VARCHAR2 и для всех имен и литералов SQL;
второй - кодировка UTF-16 для хранения типов данных Юникод NCHAR, NVARCHAR и NCLOB.
СУБД Oracle позволяет использовать оба метода одновременно.
Т.е. для БД необязательно делать выбор и метаться между умными и красивыми.

Ну и твёрдое убеждение, что SV & RZ задумали сделать хрень полную, которая убивает сам смысл UTF-16 ...
Clarion 11-12
Добавлено: 13 Январь 2026, 23:32
finsoftrz
Дед Пахом писал(а): 13 Январь 2026, 22:51
Чё ты ко мне-то привязался? Я на грека похож? Мне лично пофигу как они юникод реализовали.
Я сейчас чаем чуть не поперхнулся.

Clarion 11-12
Добавлено: 14 Январь 2026, 1:13
kreator
Игорь Столяров писал(а): 13 Январь 2026, 23:20
второй - кодировка UTF-16 для хранения типов данных Юникод NCHAR, NVARCHAR и NCLOB.
Наверно ввели для совместимости (по аналогии) с MS SQL.
finsoftrz писал(а): 13 Январь 2026, 23:32
Дед Пахом писал(а): 13 Январь 2026, 22:51
Чё ты ко мне-то привязался? Я на грека похож? Мне лично пофигу как они юникод реализовали.
Я сейчас чаем чуть не поперхнулся.
А мне типа не пофигу. Я скопирую из блокнота кусок текста UTF-8 в мой контрол ENTRY и получу кракозябры.
Clarion 11-12
Добавлено: 14 Январь 2026, 14:20
Дед Пахом
Где-то читал, что выбор между utf-8 и 16 это выбор между скоростью обмена данными и скоростью их отображения. То есть, если выбираем utf-8, то sql летает, а вывод на экран тормозит, и наоборот.
Clarion 11-12
Добавлено: 14 Январь 2026, 17:04
Дед Пахом
kreator писал(а): 14 Январь 2026, 1:13
Я скопирую из блокнота кусок текста UTF-8 в мой контрол ENTRY и получу кракозябры.
Проверил, текст UTF-8 при вставке перекодируется в родной UTF-16 самой Windows, вот пример:
Код: Выделить всё
PROGRAM
INCLUDE('winapi.inc'), ONCE
MAP
MODULE('WinAPI')
winapi::CreateWindowExW(UNSIGNED dwExStyle, LONG lpClassName, LONG lpWindowName = 0, |
UNSIGNED dwStyle, SIGNED X, SIGNED Y, SIGNED nWidth, SIGNED nHeight, |
HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LONG lpParam),HWND,RAW,PASCAL,NAME('CreateWindowExW')
END
INCLUDE('printf.inc'), ONCE
END
Window WINDOW('CreateWindowExW test'),AT(,,278,171),GRAY,SYSTEM,FONT('Segoe UI',9)
END
se TStringEncoding
!- edit control styles
ES_LEFT EQUATE(00h)
ES_MULTILINE EQUATE(04h)
ES_AUTOVSCROLL EQUATE(40h)
ctrlName STRING(256), AUTO
ctrlText STRING(256), AUTO
ctrlStyle UNSIGNED, AUTO
hwndEntry HWND, AUTO
CODE
OPEN(Window)
ctrlName = se.ToUtf16('Edit') &'<0,0>'
ctrlText = se.ToUtf16('Unicode aware ENTRY control') &'<0,0>'
ctrlStyle = BOR(BOR(WS_BORDER, WS_CHILD), WS_VISIBLE)
ctrlStyle = BOR(ctrlStyle, ES_LEFT)
ctrlStyle = BOR(ctrlStyle, BOR(ES_MULTILINE, ES_AUTOVSCROLL))
hwndEntry = winapi::CreateWindowExW( |
0, |
ADDRESS(ctrlName), |
ADDRESS(ctrlText), |
ctrlStyle, |
0, 0, 250, 100, |
Window{PROP:ClientHandle}, |
0, |
SYSTEM{PROP:AppInstance}, |
0)
printd('ENTRY handle = %x', hwndEntry)
ACCEPT
END
Вот картинка, я скопировал китайский текст из браузера (уверен он в Utf-8) в поле ввода своего окна - все иероглифы на месте.
Clarion 11-12
Добавлено: 14 Январь 2026, 21:03
kreator
Ну хорошо. А обратно? По моему примеру в блокноте получается, что текст в блокноте не utf-16. Хотя может я не прав, внутренняя кухня Винды.
Clarion 11-12
Добавлено: 16 Январь 2026, 17:30
finsoftrz
Джон Хаски анонсировал на следующую неделю серию вебинаров на тему как с помощью AI создавать и использовать COM объекты. Предполагает в дальнейшем подписку на Cloude за $20 в месяц. Наверно, такое нам всем как раз и не хватало...
Clarion 11-12
Добавлено: 16 Январь 2026, 17:41
Игорь Столяров
Неистребимо у людей желание продать что-нибудь ближнему своему ...
Причём феномен цифры 2 в этих попытках достоин отдельного исследования !
Возможно, сия фантазия берёт начало от библейского "Каждой твари по паре !"
