|
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
|
Из моей обработке по загрузке файла:
|
|||
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); КонецПроцедуры |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |