Перекодировка из UTF8 в 1251

Автор Злоп, 19 февраля 2024, 01:11

« назад - далее »

Злоп

Ну вот и пригодилась EncodeFromUTF8, перекодировал на летй ~32000 строк из файла, существенного замедления не видно.
Ок.

Злоп

Думаю, имеет смысл добавить в ALS

АЛьФ

Цитата: Злоп от 16 марта 2024, 15:58Думаю, имеет смысл добавить в ALS

Так есть же в als.

Злоп

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

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

АЛьФ

Цитата: Злоп от 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

Злоп

Про бом я и сам сообразил. Правда непонятно, почему получается один ненужный символ...

Djelf

У меня в Карлике код перекодироки ANSI<>UTF8 абсолютно аналогичен коду АЛьФ`а (это обычный шаблон, он везде используется).
Анализа на BOM и вырезания тоже нет, что-то я недодумал, что в принципе это ничему не повредит...
Видимо BOM на низком уровне надо вырезать на автомате, при раскодировании (ну можно 2й параметр сделать - пожалуйста не убивайте BOM  :) ).
А в кодировании наоборотный, 2й параметр (0/1) - добавлят BOM.
Сделаю, когда руки дойдут...

Злоп

ну так это ж кодировать/раскодировать с учетом добавлять/вырезать BOM - если это файло, а если просто строку кодировать/раскодировать - никакой бом добавлять/убирать же не надо...
?

Злоп

Например, с помощью Formex если надо сформировать UTF8 файл - создаешь обычный объект "Текст" (по умолчанию он с кодировкой Win1251), берешь нужные строки, конвертишь их через СтрокаКодировкаУТФ8 = глСервис.DecodeToUTF8(СтрокаКодировка1251); И ПИХАЕШЬ В Тескст. Потом Текст.Записать() - получается файл в кодировке UTF8? проги его нормально понимают что это кодировка УТФ8 (на просмотр нормально показывают), хотя наверное при этом никакого BOM в файле нет...

Ветер в поле

Я всегда использовал 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; //прочитаем без перекодировки
    оБуфер.ПрочитатьСтроку(ТекСтр, оБуфер.Размер());
    
    оБуфер = "";
    
    Возврат ТекСтр;
    
КонецФункции //ИзменитьКодировку