|
Прочитать файл с символами 00 | ☑ | ||
---|---|---|---|---|
0
Злопчинский
08.04.14
✎
16:23
|
есть ли в 8-ке возможность как-нить штатно, без особых извратлов прочитать файлик такого вида: http://screencast.com/t/FQr0dzbbeSU
. спсб |
|||
1
Зойч
08.04.14
✎
16:25
|
разве это не утф?
|
|||
2
Ndochp
08.04.14
✎
16:26
|
Скажи, что это юникод. Причем не 8
|
|||
3
H A D G E H O G s
08.04.14
✎
16:32
|
(0) картинка поди.
|
|||
4
H A D G E H O G s
08.04.14
✎
16:34
|
нет, не картинка.
|
|||
5
Wobland
08.04.14
✎
16:35
|
2 байта на символ.бывает
|
|||
6
Злопчинский
08.04.14
✎
16:37
|
два байта на символ - таки да, ты знал!
и вот как его зачесть нормально-то..? |
|||
7
H A D G E H O G s
08.04.14
✎
16:38
|
(6) ТекстовыйДокумент.Прочитать()
|
|||
8
Ndochp
08.04.14
✎
16:38
|
Ну так UTF 16
На выбор тебе в 1С UTF-16 UTF-16BE UTF-16LE UTF16_PlatformEndian UTF16_OppositeEndian UTF32_PlatformEndian UTF32_OppositeEndian |
|||
9
Ndochp
08.04.14
✎
16:39
|
Кстати да, (7) то пробовал уже?
|
|||
10
Злопчинский
08.04.14
✎
16:51
|
А может кто на возмездной основе запузырит мне рабочий код на 8-ке: тупо выбрать файл, прочитать строки, разделитель - табулятор, прочитанную строку выплюнуть в табло с заменой табулятора на како-нит видимый знак типа %/
файлик скину. ???? |
|||
11
aka AMIGO
08.04.14
✎
16:51
|
(9) текст-то по символу читается, а надо по байту
|
|||
12
Злопчинский
08.04.14
✎
16:51
|
писать на мыло [email protected]
или в скайп Zlopun |
|||
13
Ndochp
08.04.14
✎
16:55
|
(11) Кто сказал что по байту? в постановке - прочитать файл. Он через
ТекстовыйДокумент.Прочитать(ИмяФайла, "UTF-16"); и прочитается как положено. |
|||
14
Злопчинский
08.04.14
✎
16:58
|
(13) вторый байты с кодом символа "00" при этом проглотятся нормально? ну.. наверное да....
|
|||
15
Torquader
08.04.14
✎
17:04
|
лдлг=Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
лдлг.Заголовок="Выбираем наш несчатсный файл"; лдлг.ИндексФильтра=0;// текущий номер фильтра из списка фильров лдлг.Каталог="C:\TEMP";// текущий каталог выбора файла лдлг.МножественныйВыбор=Ложь; лдлг.ПолноеИмяФайла="";// имя файла, на входе (если где-то сохоранили то, что было в прошлый раз лдлг.ПредварительныйПросмотр=Ложь; лдлг.ПроверятьСуществованиеФайла=Истина; лдлг.Фильтр="Все файлы(*.*)|*.*";// список фильтров Если НЕ лдлг.Выбрать()Тогда Возврат; КонецЕсли; лФайл=Новый ЧтениеТекста(лдлг.ПолноеИмяФайла,КодировкаТекста.UTF16); Пока Истина Цикл лстр=лФайл.ПрочитатьСтроку(); Если лстр=НЕОПРЕДЕЛЕНО Тогда Сообщить("Файл уже закончился"); Прервать; КонецЕсли; лч=Найти(лстр,Символы.Таб); Если лч=0 Тогда Сообщить("Строка без разделителей:"+лстр); Иначе Сообщить("Первый разделитель:"+Строка(лч)+" сама строка:"+лстр); КонецЕсли; КонецЦикла; лФайл.Закрыть(); |
|||
16
Torquader
08.04.14
✎
17:05
|
(14) попробуй (15) - должно всё прочитать.
P.S. если из восьмой версии записать текстовый файл, то в нём нули и получатся - советую попробовать на досуге, чтобы понять, что 1С и Unicode созданы друг для друга. |
|||
17
Ndochp
08.04.14
✎
17:07
|
(0) Кстати, это походу UTF-16LE
|
|||
18
Злопчинский
08.04.14
✎
17:14
|
блин..ну как же долго этот снеговик грузится...
|
|||
19
Wobland
08.04.14
✎
17:23
|
(0) а какую кодировку показывает фар на скрине?
|
|||
20
Злопчинский
08.04.14
✎
17:27
|
(19) 1251
|
|||
21
H A D G E H O G s
08.04.14
✎
17:32
|
(19) (20) Он пропускает нули штоле?
|
|||
22
Злопчинский
08.04.14
✎
17:33
|
921) хз. то что вижу - на скрине в (0)
ща попробую посмотреть "продвинутым" 16-ричным редактором |
|||
23
Злопчинский
08.04.14
✎
17:36
|
ну как вообщем и ожидалось - другой кекс-редактор то ж самое показывает http://screencast.com/t/elMC01GjVC
|
|||
24
Torquader
08.04.14
✎
18:49
|
(23) Если в начале файла написать два байта FF FE, то ваш файл даже блокнот откроет без проблем.
P.S. выяснилось, что FAR2.0 не умеет переключать кодировку при редактировании файла, так как это делала первая версия. |
|||
25
Torquader
08.04.14
✎
18:54
|
Просто, по стандарту Unicode, в начале файла должен быть указан Unicode пробел, который определяет порядок байт и используемую кодировку (FF FE, FE FF или EF BB BF)
|
|||
26
Злопчинский
08.04.14
✎
19:07
|
(24) исходный файл блокнот итак открытвает без проблем -
|
|||
27
Злопчинский
08.04.14
✎
19:15
|
нихренаськи пока не получается...
|
|||
28
ifso
08.04.14
✎
19:19
|
(27) это про (18) ?)
|
|||
29
Злопчинский
08.04.14
✎
19:30
|
(28) (18) - это ваще писец!!!
. вроде получается.. я даже умею штрямкать в пофигураторе... правда в тупик впал когда не смог с ходу найти код формы... |
|||
30
Wobland
08.04.14
✎
19:42
|
(29) а выложи людям коммерчески не ценный файл. жутко интересно, что за кодировка такая
|
|||
31
Злопчинский
08.04.14
✎
19:42
|
Зашибись, я мега-программер!!! с божьей помощью и усилиями учителей заборол эту х..ю
|
|||
32
Злопчинский
08.04.14
✎
19:46
|
юникодовский файл какой-то стопудово
потому что если его открыть нотепадом и тупо сохранить по контрол+эс, а потом посмотреть фаром то он показывает типа как в (25) http://screencast.com/t/zqvJNcf6X2S1 . можно и файл выложить, но не думаю что с ним кто-то будет копаться/смотреть |
|||
33
Wobland
08.04.14
✎
19:49
|
(32) я вот прямо щас знаю человека, который бы копался, если б не спал
|
|||
34
Wobland
08.04.14
✎
19:50
|
а вот тупо сохранить нотпадом (я так думаю) записывает файл по правилам нотпадов
|
|||
35
Злопчинский
08.04.14
✎
19:51
|
в итоге вышел гулькин нос:
. &НаКлиенте Процедура Пуск(Команда) ИмяФайла="c:\000\1000016810_20140220_073219.txt"; ф=Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8); й=0; Пока Истина Цикл стр = ф.ПрочитатьСтроку(); Если стр = НЕОПРЕДЕЛЕНО Тогда Сообщить("Файл уже закончился, всего "+й+" строк"); Прервать; КонецЕсли; й=й+1; стр = СтрЗаменить(стр, Символ(0), ""); //вотздеся стр = стрЗаменить(стр, Символы.Таб, "^"); //чисто типа сработало все как надо Сообщить(""+Строка(й)+": "+Стр); КонецЦикла; ф.Закрыть(); КонецПроцедуры . некоторые личности утверждают (не будем показывать пальцем) что оператор под комментом //вотздеся в виде стр = СтрЗаменить(стр, "?", ""); тоже давал правильный результат... но чего-то у меня это сомнительно... |
|||
36
Wobland
08.04.14
✎
20:22
|
(35) завтра поставлю себе гриншот (уже пора) и наделаю скринов. я не могу объяснить эту магию
|
|||
37
Torquader
08.04.14
✎
23:20
|
(35) Напиши КодировкаТекста.UTF16 и "кушай" его без всяких нулей.
Ну не гоже читать Unicode и переводить его в ANSI программно, если эту же вещь система делает из коробки - или у вас коробки не той системы ? |
|||
38
Torquader
08.04.14
✎
23:23
|
(37) У тебя даже в файле пробелы в заголовке файла правильно расставлены - LittleEndian это называется.
|
|||
39
Злопчинский
08.04.14
✎
23:33
|
(37) как я его буду кушать без всяких нулей? ставлю UTF16, читаю строку из файла, в результате в переменной получаю обычные виндявые символы..?
|
|||
40
Torquader
08.04.14
✎
23:33
|
Вот файл:
0000000000: FEFF 0054 0065 0073 ? 0074 0020 006D 0065 ?Test me 0000000010: 0073 0073 0061 0067 ? 0065 000D 000A 004E ssage??N 0000000020: 0065 0078 0074 0020 ? 006D 0065 0073 0073 ext mess 0000000030: 0061 0067 0065 000D ? 000A 0420 0443 0441 age??Рус 0000000040: 0441 043A 0430 044F ? 0020 0441 0442 0440 ская стр 0000000050: 043E 043A 0430 ? ока Вот код: лФайл=Новый ЧтениеТекста("C:\WORK\TEST.1",КодировкаТекста.UTF16); Пока Истина Цикл лстр=лФайл.ПрочитатьСтроку(); Если лстр=НЕОПРЕДЕЛЕНО Тогда Прервать;КонецЕсли; Сообщить("Строка:"+лстр); КонецЦикла; Сообщить("Всё"); лФайл.Закрыть(); Вот результат: Строка:Test message Строка:Next message Строка:Русская строка Всё |
|||
41
Злопчинский
08.04.14
✎
23:35
|
ээээ... я когда фаром или другим хексредактором cmотрю - нифига у меня нет такого
0000000000: FEFF 00 |
|||
42
Torquader
08.04.14
✎
23:36
|
(41) А что там есть ? Просто с нуля начинается ?
|
|||
43
Torquader
08.04.14
✎
23:39
|
0000000000: FF FE 46 00 69 00 72 00 ? 73 00 74 00 20 00 6C 00 ?F i r s t l
0000000010: 69 00 6E 00 65 00 0D 00 ? 0A 00 53 00 65 00 63 00 i n e ? ? S e c 0000000020: 6F 00 6E 00 64 00 20 00 ? 6C 00 69 00 6E 00 65 00 o n d l i n e 0000000030: 0D 00 0A 00 54 00 68 00 ? 69 00 72 00 64 00 20 00 ? ? T h i r d 0000000040: 6C 00 69 00 6E 00 65 00 ? 0D 00 0A 00 20 04 43 04 l i n e ? ? ?C? 0000000050: 41 04 41 04 3A 04 30 04 ? 4F 04 20 00 41 04 42 04 A?A?:?0?O? A?B? 0000000060: 40 04 3E 04 3A 04 30 04 ? @?>?:?0? Результат: Строка:First line Строка:Second line Строка:Third line Строка:Русская строка Всё |
|||
44
Torquader
08.04.14
✎
23:40
|
0000000000: 46 00 69 00 72 00 73 00 ? 74 00 20 00 6C 00 69 00 F i r s t l i
0000000010: 6E 00 65 00 0D 00 0A 00 ? 53 00 65 00 63 00 6F 00 n e ? ? S e c o 0000000020: 6E 00 64 00 20 00 6C 00 ? 69 00 6E 00 65 00 0D 00 n d l i n e ? 0000000030: 0A 00 54 00 68 00 69 00 ? 72 00 64 00 20 00 6C 00 ? T h i r d l 0000000040: 69 00 6E 00 65 00 0D 00 ? 0A 00 20 04 43 04 41 04 i n e ? ? ?C?A? 0000000050: 41 04 3A 04 30 04 4F 04 ? 20 00 41 04 42 04 40 04 A?:?0?O? A?B?@? 0000000060: 3E 04 3A 04 30 04 ? >?:?0? Всё равно читается. |
|||
45
Злопчинский
08.04.14
✎
23:41
|
дейстивтельно читается!!! ура!!!
|
|||
46
Злопчинский
08.04.14
✎
23:42
|
(44) ты - сильное колдунство
|
|||
47
Torquader
08.04.14
✎
23:42
|
Однако - BigEndian без пробела - не съела.
|
|||
48
Torquader
08.04.14
✎
23:43
|
Немного пришлось поменять код:
лФайл=Новый ЧтениеТекста("C:\WORK\TEST.1","UTF-16BE"); Пока Истина Цикл лстр=лФайл.ПрочитатьСтроку(); Если лстр=НЕОПРЕДЕЛЕНО Тогда Прервать;КонецЕсли; Сообщить("Строка:"+лстр); КонецЦикла; Сообщить("Всё"); лФайл.Закрыть(); Оказалось, что для этого типа кодировки нет предопределённой константы - но после "кушаем и не плюёмся". |
|||
49
Torquader
08.04.14
✎
23:44
|
0000000000: 00 46 00 69 00 72 00 73 ? 00 74 00 20 00 6C 00 69 F i r s t l i
0000000010: 00 6E 00 65 00 0D 00 0A ? 00 53 00 65 00 63 00 6F n e ? ? S e c o 0000000020: 00 6E 00 64 00 20 00 6C ? 00 69 00 6E 00 65 00 0D n d l i n e ? 0000000030: 00 0A 00 54 00 68 00 69 ? 00 72 00 64 00 20 00 6C ? T h i r d l 0000000040: 00 69 00 6E 00 65 00 0D ? 00 0A 04 20 04 43 04 41 i n e ? ?? ?C?A 0000000050: 04 41 04 3A 04 30 04 4F ? 00 20 04 41 04 42 04 40 ?A?:?0?O ?A?B?@ 0000000060: 04 3E 04 3A 04 30 00 0D ? 00 0A 04 12 04 41 04 51 ?>?:?0 ? ????A?Q 0000000070: 00 0D 00 0A ? ? ? Это был "нативный UTF-16BE" без определяющего пробела - и 1С его "съела". |
|||
50
Злопчинский
08.04.14
✎
23:48
|
самый главный вопрос =- а как понять какую кодировку для чтения применять..?
|
|||
51
Torquader
08.04.14
✎
23:50
|
(50) Без "наводящего пробела" - никак - для этого его и ставят в начале файла.
Но, можно попробовать зачитать файл побайтно и посмотреть, где встречаются нули (или четвёрки), правда, если текст на китайском, то ничего не получится. Вообще-то, определение кодировки - нетривиальная задача, но зная частоту появления символов в тексте и их коды всегда можно подобрать наиболее подходящую. |
|||
52
Злопчинский
08.04.14
✎
23:55
|
(51) особенно если этот "текстовый файл" иксемеля написан не в виндяовй кодировке. Парсер поймет это по первой строке файла самостоятельно?
|
|||
53
Torquader
09.04.14
✎
00:01
|
(52) Ну, как видно из экспериментов, BE он сам не понял - его нужно было "ткнуть носом", так что - если источник файла заранее неизвестен, то можно предложить выбор пользователю.
|
|||
54
Злопчинский
09.04.14
✎
00:02
|
(53) ну ты это читал ТЕКСТОм. а если читает парсер виндявый - может он ctsuko умный?
|
|||
55
Torquader
09.04.14
✎
00:08
|
(54) Он "очень умный", но некоторые кодировки понимает неправильно - например - открой текст в Excel, и сразу станет ясно, что не понимает.
|
|||
56
Злопчинский
09.04.14
✎
00:26
|
эксель - вообще зло.
|
|||
57
Wobland
09.04.14
✎
06:36
|
вот как это понимать?
http://i.imgur.com/PxHpG31.png прочие endianы вообще иероглифы показывают http://i.imgur.com/WNigbYo.png что со мной не так? |
|||
58
Wobland
09.04.14
✎
06:40
|
гляжу, Торквадер как ЮТФ-16 читает. вот у меня: http://i.imgur.com/nU7vDBw.png
|
|||
59
Любопытная
09.04.14
✎
06:45
|
(58)у тебя винда китайская ;)
|
|||
60
Wobland
09.04.14
✎
06:50
|
(59) а я готов и в это поверить ;)
http://i.imgur.com/oMyeRux.png |
|||
61
Любопытная
09.04.14
✎
07:18
|
(60) Ну... моя вин8 прочитала файл без проблем. Но у нас с тобой разница в релизах платформы. Хотя не думаю, что это зависит от релиза. Таки грешу на ОС
|
|||
62
Torquader
09.04.14
✎
13:53
|
(58) Посмотри, что там написано UTF-16BE.
Если без BE, то получается примерно то, что у тебя в иероглифах, только у меня там были квадратики "впиши сам". |
|||
63
Torquader
09.04.14
✎
13:55
|
(58) Ещё раз для понимания и осознания граблей рекомендуется почитать при UTF-16 и UTF-16BE.
Казалось бы, очень похожие строки, а разница, как земля и небо (правда, и вывод символами из поднебесной получается). |
|||
64
Wobland
09.04.14
✎
15:17
|
(62) я все ЮТФ-16* перебирал
http://i.imgur.com/fl0aZnf.png |
|||
65
Torquader
09.04.14
✎
17:43
|
(64) Тогда файл мне на почту шли - буду смотреть, что там не вышло.
P.S. у меня на Windows Xp вчера всё читалось. |
|||
66
Wobland
09.04.14
✎
17:50
|
(65) думаю, это надо ТС просить
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |