Имя: Пароль:
1C
1C 7.7
v7: Перекодировка txt из utf-8 в windows-1251 через Adodb.Stream не работает
, ,
0 OnePrg
 
02.02.23
13:41
Взял за пример перекодировку из windows-1251 в utf-8. Не работает.

    СтримВход=СоздатьОбъект("ADODB.Stream");
    СтримВход.Type=2;
    СтримВход.charset="utf-8";    
    СтримВход.Open();
    СтримВход.LoadFromFile(ИмяФайлаУТФ8);
    
    СтримВыход=СоздатьОбъект("ADODB.Stream");
    СтримВыход.Type=2;
    СтримВыход.charset="windows-1251";
    //СтримВыход.LineSeparator=-1;
    СтримВыход.Open();
    Всего=СтримВход.size;
    Пока СтримВход.EOS=0 Цикл
        СтримВыход.WriteText(СтримВход.ReadText(Байт),?(Байт=-2,1,0));
        Состояние("" + Формат(100 * СтримВход.position/Всего,"Ч(0)5.2")+"%");
    КонецЦикла;
    СтримВыход.SaveToFile(ИмяФайла1251,2);    


Получается кодировка ANSI, а нужно windows-1251/
1 Fedor-1971
 
02.02.23
13:53
(0) так, на русской локали это и будет 1251, а что соответствует ANSI указывается в ветке реестра
2 KJlag
 
02.02.23
13:59
(0) в клюшках не работал, но вот это там не работает?

ТекстовыйДокумент (TextDocument)
Записать (Write)
Вариант синтаксиса: В файл
Синтаксис:
Записать(<ИмяФайла>, <ТипФайла>, <РазделительСтрок>)
Параметры:
<ИмяФайла> (обязательный)
Тип: Строка.
Имя файла для сохранения текста.
<ТипФайла> (необязательный)
Тип: КодировкаТекста, Строка.

а именно указать кодировку вторым параметром?
3 OnePrg
 
02.02.23
14:02
(2)

КодоваяСтраница(<?>)
Синтаксис:
КодоваяСтраница(<Режим>)
Назначение:
Установить режим кодировки текста.
Возвращает:
текущее числовое значение режима кодировки (на момент до исполнения метода).
Параметры:
<Режим> : 0 - windows-кодировка, 1 - DOS-кодировка.


Оба режима пробовал - не работает.
4 arsik
 
гуру
02.02.23
14:09
(0) Просто через ADODB.Stream прочитай текст из utf файла и запиши его уже стандартными средствами 1С чрез текстовый документ.
5 Gary417
 
02.02.23
14:13
(0) "windows-1251";
а там параметр не регистрозависимый? Windows-1251 (как в примере на сайте MS)
6 Gary417
 
02.02.23
14:13
и charset с большой буквы
7 arsik
 
гуру
02.02.23
14:20
Может проще csv сразу через ADODB.Connection ADODB.Recordset читать. Зачем эти полумеры с преобразованием?
8 OnePrg
 
02.02.23
14:22
(4)

    СтримВход=СоздатьОбъект("ADODB.Stream");
    СтримВход.Type=2;
    СтримВход.charset="UTF-8";    
    СтримВход.Open();
    СтримВход.LoadFromFile(ИмяФайлаУТФ8);
    
    СтримВход.charset="windows-1251";
    Т = СоздатьОбъект("Текст");
    Т.КодоваяСтраница(0);
    Т.ДобавитьСтроку(СтримВход.ReadText());
    Т.Записать(ИмяФайла1251);    

так тоже не работает
9 OnePrg
 
02.02.23
14:22
(5)

проверил - не регистрозависимый
10 OnePrg
 
02.02.23
14:23
(7) дай пример
11 arsik
 
гуру
02.02.23
14:23
12 Gary417
 
02.02.23
14:27
13 Gary417
 
02.02.23
14:27
(12) как надо, два объекта adodb
14 arsik
 
гуру
02.02.23
14:32
(12) Меня вот эта строка в (0) беспокоит "СтримВыход.WriteText(СтримВход.ReadText(Байт),?(Байт=-2,1,0));"
Не факт, что 1С в этот момент "СтримВход.ReadText(Байт)" строковое значение не преобразует.
15 Злопчинский
 
02.02.23
14:41
//********************************************************************************************************************************
// http://www.skalnyy.com/1s-perekodirovka-fajla/
// ВОЗМОЖНЫЕ ВАРИАНТЫ КОДИРОВОК "UTF-8" "KOI8-R" "Windows-1251" "ISO-8859-5"

Процедура глИзменитьКодовуюСтраницуФайла(имяФайла, исходнКодировка, нужнаяКодировка) Экспорт
    Если ФС.СуществуетФайл(имяФайла) = 0 Тогда
        Сообщить("Файл " + имяФайла + " - не найден! Изменение кодировки отменено.", "!");
        Возврат;
    КонецЕсли;
    ScrptCtrl = СоздатьОбъект("MSScriptControl.ScriptControl");
    ScrptCtrl.Language = "VBScript";
    ScrptCtrl.AddCode("
        |Function StrConv(Text,SourceCharset,DestCharset)
        |    Set Stream=CreateObject(""ADODB.Stream"")
        |    Stream.Type=2
        |    Stream.Mode=3
        |    Stream.Open
        |    Stream.Charset=DestCharset
        |    Stream.WriteText Text
        |    Stream.Position=0
        |    Stream.Charset=SourceCharset
        |    StrConv=Stream.ReadText
        |End Function
        |
        |sub ConvertCodepage( fileName, SourceCharset, DestCharset )
        |    set fs = CreateObject(""Scripting.FilesystemObject"")
        |    originalText = fs.openTextFile(fileName,1).readAll()
        |    convertedText = strConv(originalText, SourceCharset, DestCharset )
        |    fs.openTextFile(fileName,2,true).write(convertedText)
        |end sub
        |
        |");
    Module = ScrptCtrl.Modules("Global");
    CodeObject = Module.CodeObject;
    CodeObject.ConvertCodepage(имяФайла, исходнКодировка, нужнаяКодировка);
КонецПроцедуры //ИзменитьКодовуюСтраницуФайла()
16 OnePrg
 
02.02.23
14:51
(15)

    CodeObject.ConvertCodepage(имяФайла, исходнКодировка, нужнаяКодировка); <-- Ошибка выполнения Microsoft VBScript: Недопустимый вызов или аргумент процедуры

исходнКодировка = "UTF-8"
нужнаяКодировка = "Windows-1251"
17 Злопчинский
 
02.02.23
16:07
(16) пичалька...может http://calendar.vpogiba.info/wg/wsh/uconv.htm
18 OnePrg
 
02.02.23
16:50
Всем спасибо - отбой.
Админ сервера переделал выгрузку в виндозную кодировку. Не успел проверить все варианты.
Хоть бы предупредил :)