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

Здесь обсуждается всё, что касается макросов.
buniak_a_h
Posts: 1852
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 116 times
Been thanked: 165 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, не получается. Если Вы знаете, как "исправить" некорректную строку, не могли бы Вы выложить скрипт?

citRiks
Posts: 644
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 175 times
Been thanked: 43 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: 5817
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 147 times
Contact:

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

Post by zg »

citRiks wrote:
Sat 09 May, 2020 13:18
В Луа такого нет, а в этой библиотеке, как я догадываюсь, encoding задается бом-ом (?)
мне кажется что было бы правильнее не делать никаких БОМОв, а если надо то сделать функцию encoding,
не пишите о том, о чём не понимаете.

User avatar
John Doe
Бюрократ
Posts: 12826
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 286 times

Ошибки из-за ужесточения проверки 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 чат

buniak_a_h
Posts: 1852
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 116 times
Been thanked: 165 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: 12826
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 286 times

Ошибки из-за ужесточения проверки 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 чат

buniak_a_h
Posts: 1852
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 116 times
Been thanked: 165 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: 12826
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 286 times

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

Post by John Doe »

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

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

То что с новой версией библиотека выбрасывает исключение - помогает избежать ошибок, касающихся второго случая.
https://t.me/FarManager — Telegram чат

Post Reply

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