Имя: Пароль:
1C
1C 7.7
v7: Перекодировка txt в utf-8. Adodb.Stream не работает. Что делать?
,
0 SAAAAS
 
01.08.11
07:09
Всем привет!
Перекодирую текст с помощью Adodb.Stream. 1С вылетает на методе Stream.WriteText(Text). С короткой строкой проблем нет, а у меня Файл текстовый 1,5Мб.

Есть тема в архиве: utf8
Делаю все в точности.

Попробовал другой вариант. Сначала записать файл, а потом перекодировать. Тоже самое.
Ребят, подскажите пожалуйста, где копать?
1 Vinianel
 
01.08.11
07:22
Мне помогло следующее:

Текст = СоздатьОбъект("Текст");
Текст.ДобавитьСтроку(Stream.readText());
2 SAAAAS
 
01.08.11
07:28
Спасибо, Кристина!
Я вот только думал в этом направлении, чтобы как-то по строке перекодировать.
3 Vinianel
 
01.08.11
07:35
(2) Там тоже получится одна длинная строка, но её потом можно разбить построчно и т.п.
4 SAAAAS
 
01.08.11
07:54
Сейчас пробую. Напишу результат. То есть если я правильно понял, после

Текст = СоздатьОбъект("Текст");
Текст.ДобавитьСтроку(Stream.readText());

Должен заработать:

Stream.WriteText(Текст);

Правильно?
5 Vinianel
 
01.08.11
07:56
Stream.WriteText(Текст); --->>> Это вообще не надо.
Текст запишется в одинэсовский объект "Текст". С ним затем и  работай.
6 SAAAAS
 
01.08.11
08:00
Так, но потом Текст.Записать() и где кодировка? Кодировка будет стандартной DOS или Windows. Правильно? А мне надо utf-8
7 Vinianel
 
01.08.11
08:00
Из моей обработке по загрузке файла:


Если НужнаПерекодировка = 1 Тогда
   // Перекодировка.
   Стрим = СоздатьОбъект("ADODB.Stream");
   Стрим.Type = 2;
   Стрим.charset = "windows-1251";
   Стрим.Open();
   Стрим.LoadFromFile(СокрЛП(ВыбФайл));
   Стрим.charset = "utf-8";
       
   ВремТекст = СоздатьОбъект("Текст");
   ВремТекст.ДобавитьСтроку(Стрим.readText());
   Стрим.close();
   Стрим = "";
КонецЕсли;

// Здесь у меня разбивается на строки помельче, идет замена некоторых символов и т.п. На выходе получаем многострочный текст, который уже можно записать в файл.
Текст = ОбработатьТекст(ВремТекст);
8 smaharbA
 
01.08.11
08:17
Стрим = СоздатьОбъект("ADODB.Stream");
Стрим.Type = 2;
Стрим.charset = "windows-1251";
Стрим.Open();
Стрим.LoadFromFile(СокрЛП(ВыбФайл));
Стрим.charset = "utf-8";
Пока Стрим.EOS=0 Цикл
   Сообщить(Стрим.readText(-2));
КонецЦикла;
Стрим.close();
9 Vinianel
 
01.08.11
08:23
(8) Спасибо :)
10 SAAAAS
 
01.08.11
08:35
Stream = СоздатьОбъект("Adodb.Stream");
Stream.Charset="windows-1251";
Stream.Type = 2;
Stream.Open();
Stream.LoadFromFile(Файлtxt);

ВремТекст = СоздатьОбъект("Текст");
ВремТекст.ДобавитьСтроку(Stream.ReadText());
Stream.Close();
Текст.Записать(Файл2);

И после этого Файл2 совсем не в utf-8? Что не так?
11 SAAAAS
 
01.08.11
08:36
*пардон в конце ВремТекст.Записать(Файл2);
12 1Сергей
 
01.08.11
08:37
(10) откуда взялся объект Текст?
13 andrewks
 
01.08.11
08:37
(10) ты чё к этому Тексту привязался? делаешь через Stream - ну так и делай. Текст не поддерживает unicode
14 smaharbA
 
01.08.11
08:38
а где смена чарсета (а по хорошему и позиционирование на начало) ?
15 filh
 
01.08.11
08:38
Стрим = СоздатьОбъект("ADODB.Stream");
Стрим.Type = 2;
Стрим.charset = "windows-1251";
Стрим.Open();
Стрим.LoadFromFile(СокрЛП(ВыбФайл));
Стрим.charset = "utf-8";
ВремТекст = СоздатьОбъект("Текст");
Пока Стрим.EOS=0 Цикл
   ВремТекст.ДобавитьСтроку(Стрим.readText(-2));
КонецЦикла;
Стрим.close();
ВремТекст.Записать(Файл2);
16 andrewks
 
01.08.11
08:38
+(13) а, хотя тут utf-8, может и взлететь
17 smaharbA
 
01.08.11
08:38
(13) утф8 вполне "поддерживает" в нем практически не присутствует симв(0)
18 1Сергей
 
01.08.11
08:38
(15) ему нужно записать в ЮТФ, а не прочитать
19 andrewks
 
01.08.11
08:40
(17) да, понял уже. но всё равно изврат. Stream надо юзать и для чтения, и для записи
20 SAAAAS
 
01.08.11
08:44
Проблема в том, что  Stream при записи Stream.WriteText(Text) 1С вылетает и все. Никаких ошибок, просто закрывается. В чем причина неясно
21 vde69
 
01.08.11
08:45
77 имеет ограничение на размер строки, где-то около 800 килобайт.

по этому поточные операции должны идти вне контеста 1с
22 vde69
 
01.08.11
08:46
(21)+ то есть переменная хранящая текст должны быть НЕ 1с
23 SAAAAS
 
01.08.11
08:47
Как это реализовать?
24 vde69
 
01.08.11
08:51
(23) COM объект создавать не в 1с, или загружать кусками.

кроме того в 1с в строковой переменной есть запрещенные символы, по этому если файл их содержит они просто исчезнут из результата....

используй ADO для текстовых файлов и конверти средствами TSQL
25 SAAAAS
 
01.08.11
08:53
(24)Спасибо, буду пробовать.
26 SAAAAS
 
01.08.11
08:53
И вообще, всем спасибо!
27 vde69
 
01.08.11
09:06
Привожу выдержку и описания компоненты BinFiles.dll


Непосредственному хранению двоичных данных в длинных строках 1С Предприятие 7.7 мешают
следующие обстоятельства:
1. 1С Предприятие "не признаёт" символ с кодом 0 в строках.
2. Большинство символов с кодами 1-32 в длинной строке при осуществлении операции
"Тестирование и исправление ИБ" будут восприняты как ошибка.
3. При сохранении длинной строки 1С Предприятие обрезает конечные пустые символы
(пробел, перевод строки и т.п.), что для двоичных данных недопустимо.
4. Размер длинной строки ограничен значением ~780Кб.
28 SAAAAS
 
01.08.11
09:12
(15) а после этого все равно файл то не utf-8
29 KishMish
 
01.08.11
09:17
30 SAAAAS
 
01.08.11
09:47
(29) спасибо, но это не то, там только кирилица и цифры переводятся в utf
31 Дык ё
 
01.08.11
09:57
32 smaharbA
 
01.08.11
10:10
Автор тебе файл перекодировать ?
33 SAAAAS
 
01.08.11
10:18
(32)Угу.
34 smaharbA
 
01.08.11
11:26
//*******************************************
Процедура Сформировать()
   Перем Имя,Путь;
   Байт=255;
   Если ФС.ВыбратьФайл(0,Имя,Путь,"","Файлы|*","*")=0 Тогда
       Возврат;
   КонецЕсли;
   СтримВход=СоздатьОбъект("ADODB.Stream");
   СтримВход.Type=2;
   СтримВход.charset="windows-1251";
   СтримВход.Open();
   СтримВход.LoadFromFile(Путь+Имя);
   СтримВыход=СоздатьОбъект("ADODB.Stream");
   СтримВыход.Type=2;
   СтримВыход.charset="utf-8";
   СтримВыход.LineSeparator=-1;
   СтримВыход.Open();
   Всего=СтримВход.size;
   Пока СтримВход.EOS=0 Цикл
       СтримВыход.WriteText(СтримВход.ReadText(Байт),?(Байт=-2,1,0));
       Состояние("" + Формат(100 * СтримВход.position/Всего,"Ч(0)5.2")+"%");
   КонецЦикла;
   СтримВыход.SaveToFile(Путь+Имя+".utf8",2);
КонецПроцедуры
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.