Форум Кладовочки АЛьФ`а

Обсуждение проектов => FormEx => Тема начата: Злоп от 19 февраля 2024, 01:11

Название: Перекодировка из UTF8 в 1251
Отправлено: Злоп от 19 февраля 2024, 01:11
Перекодировать в UTF - есть, а перекодировать ИЗ - нет...
Предлагаю рассмотреть вопрос перекодировки ИЗ UTF8 в 1251.
Пару раз уже попадались клиенты, к которым из внешних источников приходит в UTF8, хотя подмножество символов там укладывается в 1251 (вот сижу как раз с таким файликом).
Понятно что при перекодировке ИЗ могут получиться "нечитаемые/невидимые символы" по таблице 1251 - тггад их заменять на знак вопроса "?" в колировке 1251.
.
примерно так как-то
Название: Re: Перекодировка из UTF8 в 1251
Отправлено: АЛьФ от 19 февраля 2024, 09:08
Запросы такие уже поступали и даже есть метод EncodeFromUTF8. Только не помню насколько он работоспособен.
Название: Re: Перекодировка из UTF8 в 1251
Отправлено: АЛьФ от 19 февраля 2024, 09:10
И кто-то (не будем показывать пальцем) даже обещался потестить...
https://mista.ru/topic/861846#815
Название: Re: Перекодировка из UTF8 в 1251
Отправлено: АЛьФ от 19 февраля 2024, 09:14
Сейчас глянул в исходники, нет смысла проверять, т.к. в EncodeFromUTF8 тот же код, что и в DecodeToUTF8.
Попробую вечером сегодня допилить.
Название: Re: Перекодировка из UTF8 в 1251
Отправлено: Злоп от 19 февраля 2024, 21:52
Цитата: АЛьФ от 19 февраля 2024, 09:10И кто-то (не будем показывать пальцем) даже обещался потестить...
https://mista.ru/topic/861846#815
Это был слонёнок... ?
Название: Re: Перекодировка из UTF8 в 1251
Отправлено: АЛьФ от 19 февраля 2024, 21:59
Кстати, EncodeFromUTF8 доделал и добавил в документацию. Сейчас готовлю тестовую сборку для выкладывания.

Что-то по тестовой замечаний давно не возникало... Надо уже, наверное, ее выкладывать, как рабочую и двигать дальше.
Название: Re: Перекодировка из UTF8 в 1251
Отправлено: MWW_Ruza от 19 февраля 2024, 22:18
Конечно, если кроме Формекса ничего не используешь, то надо... А если все равно работаешь с интернетом и т.п. то есть ВК от Djelf, curl1c(карлик в простонародье :) ), там есть методы конвертации и туда и обратно, в разные форматы, очень неплохо работает. Особо нет смысла Алексея этим грузить...
Название: Re: Перекодировка из UTF8 в 1251
Отправлено: АЛьФ от 19 февраля 2024, 22:25
Цитата: MWW_Ruza от 19 февраля 2024, 22:18Особо нет смысла Алексея этим грузить...

Там пять строк кода.
Загружена была только память моя, чтобы не забыть глянуть функцию. Вот это реально было тяжело.
Название: Re: Перекодировка из UTF8 в 1251
Отправлено: Злоп от 20 февраля 2024, 21:23
Цитата: MWW_Ruza от 19 февраля 2024, 22:18Конечно, если кроме Формекса ничего не используешь, то надо... А если все равно работаешь с интернетом и т.п. то есть ВК от Djelf, ...
Если есть возможность обойтись одной вк - то лучше так, тем более что один метод Уде был, а
.. если есть гриб груздь, то должен быть и гриб радоздь...
Название: Re: Перекодировка из UTF8 в 1251
Отправлено: Злоп от 20 февраля 2024, 21:25
Цитата: АЛьФ от 19 февраля 2024, 21:59Что-то по тестовой замечаний давно не возникало... Надо уже, наверное, ее выкладывать, как рабочую и двигать дальше.
Не у всех вот прямо состояние "поперло!", у кого-то состояние "тупняк..."
Название: Re: Перекодировка из UTF8 в 1251
Отправлено: Злоп от 21 февраля 2024, 23:05
Типа тестирую перекодировку.
Просится что-то типа
Сервис.ОпределитьКодировку(<Строка>,<КодировкаСтрокой>);
Возвращает числовое значение кодировки, типа 1 - DOS, 2 - 1251, 3 - UTF8, 0 - не удалось определить кодировку/другая кодировка какаято
<Строка> - строка для определения кодировки
<КодировкаСтрокой> - строковое обозначение кодировки (в общепринятой нотации), соответствующее возвращаемому числовому значению (для 0 - соответствует "?" или "неизвестная кодировка" или пустая строка или...)
.
Название: Re: Перекодировка из UTF8 в 1251
Отправлено: АЛьФ от 21 февраля 2024, 23:13
Цитата: Злоп от 21 февраля 2024, 23:05Типа тестирую перекодировку.
Просится что-то типа
Сервис.ОпределитьКодировку(<Строка>,<КодировкаСтрокой>);
Возвращает числовое значение кодировки, типа 1 - DOS, 2 - 1251, 3 - UTF8, 0 - не удалось определить кодировку/другая кодировка какаято
<Строка> - строка для определения кодировки
<КодировкаСтрокой> - строковое обозначение кодировки (в общепринятой нотации), соответствующее возвращаемому числовому значению (для 0 - соответствует "?" или "неизвестная кодировка" или пустая строка или...)
.


Я не знаю метода определения кодировки.
Название: Re: Перекодировка из UTF8 в 1251
Отправлено: Злоп от 22 февраля 2024, 00:34
Цитата: АЛьФ от 21 февраля 2024, 23:13Я не знаю метода определения кодировки.
"А, блин!!!" сказали рабочие!
Название: Re: Перекодировка из UTF8 в 1251
Отправлено: Злоп от 22 февраля 2024, 01:22
Слоненок вернулся из джунглей...
Попытался потестить перекодировку туда-сюда
Вроде работает...
Тестовый пример (https://wdfiles.ru/2Om3z)

Что важно: если строку, получившуюся в результате Decode или Encode надо записать в файл- то пишем в файлик с кодовой страницей 1251...
Название: Re: Перекодировка из UTF8 в 1251
Отправлено: Злоп от 23 февраля 2024, 22:40
Цитата: Злоп от 22 февраля 2024, 01:22то важно: если строку, получившуюся в результате Decode или Encode надо записать в файл - то пишем в файлик с кодовой страницей 1251...
.
Думаю, надо включить в ALS типа описание дополнить:

Т = СоздатьОбъект("Текст");
Т.КодоваяСтраница(0); // 0 - windows-кодировка
СтрокаВкодировкеUTF8 = Сервис.DecodeToUTF8("строка для перкодировки");
Т.ДобавитьСтроку(СтрокаВкодировкеUTF8);
Т.Записать(ИмяФайла); // файл будет в кодировке UTF8!
Название: Re: Перекодировка из UTF8 в 1251
Отправлено: Злоп от 27 февраля 2024, 23:24
Ну вот и пригодилась EncodeFromUTF8, перекодировал на летй ~32000 строк из файла, существенного замедления не видно.
Ок.
Название: Re: Перекодировка из UTF8 в 1251
Отправлено: Злоп от 16 марта 2024, 15:58
Думаю, имеет смысл добавить в ALS
Название: Re: Перекодировка из UTF8 в 1251
Отправлено: АЛьФ от 16 марта 2024, 16:41
Цитата: Злоп от 16 марта 2024, 15:58Думаю, имеет смысл добавить в ALS

Так есть же в als.
Название: Re: Перекодировка из UTF8 в 1251
Отправлено: Злоп от 03 ноября 2024, 00:58
Если взять файл в кодировке UTF8, прочитать первую строку штатным методом объекта "Текст" и сделать
Стр = глСервис.EncodeFromUTF8(ТутПерваяСтрока);
то на выходе в Стр в первом символе получим мусор какой-то и этот первый символ лишний, его надо отрезать. По крайне мере это так если файл начинается с кода: EF BB BF

Просто заметки на полях.
Название: Re: Перекодировка из UTF8 в 1251
Отправлено: АЛьФ от 03 ноября 2024, 10:56
Цитата: Злоп от 03 ноября 2024, 00:58Если взять файл в кодировке UTF8, прочитать первую строку штатным методом объекта "Текст" и сделать
Стр = глСервис.EncodeFromUTF8(ТутПерваяСтрока);
то на выходе в Стр в первом символе получим мусор какой-то и этот первый символ лишний, его надо отрезать. По крайне мере это так если файл начинается с кода: EF BB BF

Просто заметки на полях.


Это BOM - https://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%80%D0%BA%D0%B5%D1%80_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%B1%D0%B0%D0%B9%D1%82%D0%BE%D0%B2
Название: Re: Перекодировка из UTF8 в 1251
Отправлено: Злоп от 03 ноября 2024, 12:06
Про бом я и сам сообразил. Правда непонятно, почему получается один ненужный символ...
Название: Re: Перекодировка из UTF8 в 1251
Отправлено: Djelf от 03 ноября 2024, 15:08
У меня в Карлике код перекодироки ANSI<>UTF8 абсолютно аналогичен коду АЛьФ`а (это обычный шаблон, он везде используется).
Анализа на BOM и вырезания тоже нет, что-то я недодумал, что в принципе это ничему не повредит...
Видимо BOM на низком уровне надо вырезать на автомате, при раскодировании (ну можно 2й параметр сделать - пожалуйста не убивайте BOM  :) ).
А в кодировании наоборотный, 2й параметр (0/1) - добавлят BOM.
Сделаю, когда руки дойдут...
Название: Re: Перекодировка из UTF8 в 1251
Отправлено: Злоп от 03 ноября 2024, 19:15
ну так это ж кодировать/раскодировать с учетом добавлять/вырезать BOM - если это файло, а если просто строку кодировать/раскодировать - никакой бом добавлять/убирать же не надо...
?
Название: Re: Перекодировка из UTF8 в 1251
Отправлено: Злоп от 03 ноября 2024, 19:19
Например, с помощью Formex если надо сформировать UTF8 файл - создаешь обычный объект "Текст" (по умолчанию он с кодировкой Win1251), берешь нужные строки, конвертишь их через СтрокаКодировкаУТФ8 = глСервис.DecodeToUTF8(СтрокаКодировка1251); И ПИХАЕШЬ В Тескст. Потом Текст.Записать() - получается файл в кодировке UTF8? проги его нормально понимают что это кодировка УТФ8 (на просмотр нормально показывают), хотя наверное при этом никакого BOM в файле нет...
Название: Re: Перекодировка из UTF8 в 1251
Отправлено: Ветер в поле от 04 ноября 2024, 11:33
Я всегда использовал BinaryData из 1cpp для перекодировки. А для перекодировки единичных строк просто написал функцию для перекодировки из любой систем в любую с использованием того же BinaryData

// Кодировки: 0 - windows-1251, 1 - OEM, 2 - UTF-16, 3 - UTF-8
Функция ИзменитьКодировку(Стр, ИсхКодировка, КонКодировка) Экспорт
    Перем ТекСтр;
   
    оБуфер = СоздатьОбъект("BinaryData");
    оБуфер.Кодировка = КонКодировка;
   
    Если ИсхКодировка = 0 Тогда
        оБуфер.ЗаписатьСтроку(Стр, 1);
       
    Иначе
        оБуферИсх = СоздатьОбъект("BinaryData");
        оБуферИсх.ЗаписатьСтроку(Стр, 1);
        оБуферИсх.Перейти(0, 0);
        оБуферИсх.Кодировка = ИсхКодировка;
       
        Если ИсхКодировка >= 2 Тогда //UTF-16 или 8
            Пока оБуферИсх.ПрочитатьСтроку(ТекСтр, 0) = 1 Цикл
                оБуфер.ЗаписатьСтроку(ТекСтр, 0);
            КонецЦикла;
           
        Иначе
            оБуферИсх.ПрочитатьСтроку(ТекСтр, оБуферИсх.Размер());
            оБуфер.ЗаписатьСтроку(ТекСтр, 1);
        КонецЕсли;
       
        оБуферИсх = "";
    КонецЕсли;
   
    оБуфер.Перейти(0, 0);
    оБуфер.Кодировка = 0; //прочитаем без перекодировки
    оБуфер.ПрочитатьСтроку(ТекСтр, оБуфер.Размер());
   
    оБуфер = "";
   
    Возврат ТекСтр;
   
КонецФункции //ИзменитьКодировку