Ошибки из-за ужесточения проверки UTF-8 в строках

Здесь обсуждается всё, что касается макросов.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Ошибки из-за ужесточения проверки UTF-8 в строках

Post by buniak_a_h »

Latest post of the previous page:

John Doe wrote: Sat 09 May, 2020 11:23 Некорректную строку можно 'исправить'.
Это было бы здорово.
для примера строка test="123абв"..win.Uuid()
Понятно, что она некорректна. НО!
Старый Far возвращал test:len()=22 (6 "корректных" символов + 16 в GUID-е), что логично.
Новый функции таблицы utf8 валятся; таблицы string выдают 25 (считают, естественно, символы кириллицы за два байта).
Функция unicode.utf8.byte у старого FAR-а ожидаемо выдаёт двухбайтовые коды для кириллицы, остальное как string.byte; у нового валится по некорректной строке. Т.е. получить то же, что делал старый Far, не получается. Если Вы знаете, как "исправить" некорректную строку, не могли бы Вы выложить скрипт?
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Ошибки из-за ужесточения проверки UTF-8 в строках

Post by citRiks »

buniak_a_h, Добавлю свое глупое рассуждение.
Вот возьмем как в C#, и я думаю и в большинстве языков это так.
Там строка может быть вообще любая, хоть с бимом, хоть с бомом.
байты могут быть любые, но это никак не мешает работе со строками.
Да, в C# есть понятие encoding, т.е. строку можно конвертировать в тот encoding который тебе нужен когда тебе нужен.
В Луа такого нет, а в этой библиотеке, как я догадываюсь, encoding задается бом-ом (?)
мне кажется что было бы правильнее не делать никаких БОМОв, а если надо то сделать функцию encoding,
типа string.encode(str, "Windows-1251").
Хотя согласен что разговор бесполезный,
так как никто из нас переписывать не будет конечно, то что Ванга нам наваяла.

Мне нравятся ваши предложения, еще не опробовал правда.
Там все проблемы проадресованы, норм. работает?

у меня вот например MobDebug завалился, я тут писал
viewtopic.php?p=161017#p161017

Ладно макросы фаровские, но печалит что всякие внешние такие модули перед употреблением надо адаптировать,
поэтому да, нужен скрипт вроде предоставленного Шмуэль+Буняк, видимо это и является решением
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Ошибки из-за ужесточения проверки UTF-8 в строках

Post by zg »

citRiks wrote: Sat 09 May, 2020 13:18В Луа такого нет, а в этой библиотеке, как я догадываюсь, encoding задается бом-ом (?)
мне кажется что было бы правильнее не делать никаких БОМОв, а если надо то сделать функцию encoding,
не пишите о том, о чём не понимаете.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Ошибки из-за ужесточения проверки UTF-8 в строках

Post by John Doe »

buniak_a_h wrote: Sat 09 May, 2020 13:00 Понятно, что она некорректна. НО!
Если заведомо понятно что она некорректна, то зачем пытаться применить к ней юникодные функции?
buniak_a_h wrote: Sat 09 May, 2020 13:00 Если Вы знаете, как "исправить" некорректную строку
Тут всё зависит от того, что понимается под "исправить".
Если вы хотите "хоть как-то" отобразить заведомо бинарную строку, то это можно например применить преобразование Ansi->utf8.
Если же это обрывок юникодной строки, то алгоритм должен быть другой.
И т.п.
https://t.me/FarManager — Telegram чат
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Ошибки из-за ужесточения проверки UTF-8 в строках

Post by buniak_a_h »

John Doe wrote: Sat 09 May, 2020 14:08 Если заведомо понятно что она некорректна, то зачем пытаться применить к ней юникодные функции?
На примере byte ясно, что если часть строки - корректная юникодная, а часть - нет, то старый ФАР делал всё очень правильно. Увы, я сделал тот скрипт, что я с Вами написал выше, он для не-юникодных строк автоматом переключается на string. Это спасает от вылета, но и работает не так, как кажется правильным (во всяком случае, мне и авторам старой библиотеки).
John Doe wrote: Sat 09 May, 2020 14:08 Тут всё зависит от того, что понимается под "исправить".
Вот и я об этом.
Функция far.Show как-то же обрабатывает и выводит такие строки, и не падает по некорректности utf-строки. И символы отображает логично: какие может - отображает, какие не может - заменяет на вопросик. Вот и хотелось бы иметь то же самое. Ну, если не все функции (match, наверно, трудно заставить сравнивать некорректные символы), но хотя бы те, что занимаются подсчётом символов - можно было бы заставить. Т.е. функцию utf8valid надо заставить анализировать не всю строку, а по символам и некорректный символ заменять на такую фигню, которая ни с каким шаблоном не совпадёт.
На самом деле понял. Обойдусь.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Ошибки из-за ужесточения проверки UTF-8 в строках

Post by John Doe »

buniak_a_h wrote: Sat 09 May, 2020 14:25 На самом деле понял. Обойдусь.
Это хорошо.
buniak_a_h wrote: Sat 09 May, 2020 14:25 far.Show как-то же обрабатывает и выводит такие строки, и не падает по некорректности utf-строки
Основной вопрос именно в том что такое "некорректная строка".
В каждом случае ответ может быть свой, и от него зависит способ исправления.

Тупо игнорировать некорректные символы это далеко не всегда правильно.
Но если это именно то что вы хотите, то воспользуйтей например функциями конвертации из таблицы win.
https://t.me/FarManager — Telegram чат
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Ошибки из-за ужесточения проверки UTF-8 в строках

Post by buniak_a_h »

John Doe wrote: Sat 09 May, 2020 14:40 Основной вопрос именно в том что такое "некорректная строка".
На самом деле ответ прост: строка, для которой utf8.utf8valid = false (ну, или для которой функции из таблицы utf8 len, match и далее по списку валятся).
Вопрос не в том, что есть некорректная строка, а в том, как из неё получить корректную с наименьшими потерями информации. В частности, если имеется строка из примера, то "корректна часть" (первые 6 символов - не менять, далее один байт, возможно заменить на OemToUtf8 от этого символа и т.д.…)
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Ошибки из-за ужесточения проверки UTF-8 в строках

Post by John Doe »

buniak_a_h wrote: Sat 09 May, 2020 14:54 Вопрос не в том, что есть некорректная строка, а в том, как из неё получить корректную
Вопрос именно в этом, и только в этом.

Если в строке испорчен символ - это одно.
Если строка вообще не utf-8, то совсем другое.

То что с новой версией библиотека выбрасывает исключение - помогает избежать ошибок, касающихся второго случая.
https://t.me/FarManager — Telegram чат
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Ошибки из-за ужесточения проверки UTF-8 в строках

Post by citRiks »

buniak_a_h,
мне надо ваш кусок кода "враппер" добавить в модуль @Xer0X-а:
https://github.com/dr-dba/far-lua-gener ... 0Xer0X.Lua
хочу сделать сноску на автора и код автора, скажите куда конкретно сноситься?
думаю даже следует это оформить отдельной темой, чтобы сноситься на нее
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Ошибки из-за ужесточения проверки UTF-8 в строках

Post by buniak_a_h »

citRiks wrote: Sat 20 Feb, 2021 16:23 buniak_a_h,
мне надо ваш кусок кода "враппер" добавить в модуль @Xer0X-а
хочу сделать сноску на автора и код автора, скажите куда конкретно сноситься?
думаю даже следует это оформить отдельной темой, чтобы сноситься на нее
Вообще-то, хотя изначально идея была моя, но окончательный вид ей придал HaRT. У меня только имена функций слегка изменены.
P/S. Это всё - в этой теме, на предыдущей странице.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Ошибки из-за ужесточения проверки UTF-8 в строках

Post by John Doe »

citRiks wrote: Sat 20 Feb, 2021 16:23 мне надо ваш кусок кода "враппер" добавить в модуль @Xer0X-а:
В личных целях на здоровье, но очень не рекомендуется такое распространять.
https://t.me/FarManager — Telegram чат
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Ошибки из-за ужесточения проверки UTF-8 в строках

Post by citRiks »

John Doe, у вас есть способ ограничить действие этого "враппера" на конкретный модуль/скрипт?
у меня есть некоторые наметки, но доберусь не скоро
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Ошибки из-за ужесточения проверки UTF-8 в строках

Post by John Doe »

Я вижу этому врапперу одно применение: быстрый фикс какого-то скрипта, написанного до того как поменялась наша utf8-библиотека.

Всё прочее можно писать сразу так, чтобы враппер не понадобился. Если что-то неясно - давайте на примерах.
https://t.me/FarManager — Telegram чат
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Ошибки из-за ужесточения проверки UTF-8 в строках

Post by citRiks »

John Doe wrote: Sat 20 Feb, 2021 19:58 Всё прочее можно писать сразу так, чтобы враппер не понадобился.
если "сразу писать" то действительно не столько проблема.
А проблема с массой уже написанного до нового УТФ8
Хорошо когда оно просто падает,
и когда видно что падает на новом УТФ8.
Хужее когда может быть какое непредсказуемое поведение.

У всех разные задачи, кому как, может я не прав в чем.
я вот "люблю" (не то что прямо "люблю", но представляется полезным)
взять чей-то какой-то код, посмотреть как работает, приспособить.
и этот код не обязательно с фаро-форума даже может быть.
И логично что мне не нужны сюрпризы ни явные изза УТФ8,
ни тем более неявные изза УТФ8
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Ошибки из-за ужесточения проверки UTF-8 в строках

Post by buniak_a_h »

John Doe wrote: Sat 20 Feb, 2021 19:58 Всё прочее можно писать сразу так, чтобы враппер не понадобился

Не реклама. Не рекомендация. Просто делюсь моим опытом борьбы за живучесть.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Ошибки из-за ужесточения проверки UTF-8 в строках

Post by John Doe »

citRiks wrote: Mon 22 Feb, 2021 11:47 Хорошо когда оно просто падает,
и когда видно что падает на новом УТФ8.
Хужее когда может быть какое непредсказуемое поведение.
Вы правы, но с точностью до наоборот: раньше поведение на некорректных данных было неопределено, а теперь гарантированно падает.
citRiks wrote: Mon 22 Feb, 2021 11:47 взять чей-то какой-то код, посмотреть как работает, приспособить.
Я вовсе не возражаю против любых изменений вашей системы в любых целях.
Я против распространения кода, безусловно (и неявно) переписывающего юникодные функции для всей среды.
https://t.me/FarManager — Telegram чат
Post Reply

Return to “Обсуждение макросов”