Имя: Пароль:
1C
1C 7.7
v7: XBase как узнать кодовую страницу?
0 sysadminlk
 
11.01.14
12:00
XBase как узнать кодовую страницу
ТрансДат .КодоваяСтраница()
всегда возвращает 1251

ТрансДат = СоздатьОбъект("XBase");
ОткрытьФайл(АдресФайла);
Сообщить(ТрансДат.КодоваяСтраница());
ТрансДат.ЗакрытьФайл();
1 Mikeware
 
11.01.14
12:11
Ну, прочитай файл как бинарный, возьми из заголовка...
2 Torquader
 
11.01.14
12:32
(1) Если заголовок правильно заполнен.
А, если писали также, как читают, то может быть много сюрпризов.
3 sysadminlk
 
11.01.14
12:52
Есть еще варианты узнать кодировку DBF ?
4 Torquader
 
11.01.14
13:14
(3) Она, в любом случае, однобайтовая - но реальную кодировку нужно спрашивать у программы, которая её писала - просто 1С умеет не все кодировки - так что, если она не стандартная, придётся преобразовывать руками.
5 sysadminlk
 
11.01.14
14:21
у меня только два варианта
дбф без указания кодировки
и дбф с дос кодировкой

вот нужно как-то их разобрать кто из них кто
6 Mikeware
 
11.01.14
14:31
(5) давно бы взял и попробовал
7 sysadminlk
 
11.01.14
15:02
(1) подскажите как взять из заголовка
8 mdocs
 
11.01.14
15:05
(0) 99% битый дбф. я когда читал два раза в разных кодировках и брал где больше русских букв.
9 Mikeware
 
11.01.14
15:25
10 sysadminlk
 
11.01.14
15:32
(9) не понятно как в 1с можно глянуть заголовок
11 Mikeware
 
11.01.14
15:39
12 Mikeware
 
11.01.14
15:39
пля. я год сразу не глянул....
13 sysadminlk
 
11.01.14
17:17
все-равно не понятно как прочиать первые байты чтоб кодировку определить
14 sysadminlk
 
11.01.14
17:17
:(
15 Mikeware
 
11.01.14
17:19
(13)  FSO
16 sysadminlk
 
11.01.14
17:28
это понятно я уже все методы перепробывал не могу вкурить как
17 Mikeware
 
11.01.14
17:29
30-й байт считал? (если с первого считать)?
18 Mikeware
 
11.01.14
17:30
binfiles.dll поищи, если с фсо проблемы...
19 sysadminlk
 
11.01.14
17:32
fso=СоздатьОбъект("Scripting.FileSystemObject");
        File=fso.getFile(Адрес);        
        Stream=File.OpenAsTextStream(1,0);
        Сообщить(ТипЗначенияСтр(Stream));
        
OLE.ITextStream
20 sysadminlk
 
11.01.14
17:34
Процедура Сформировать()        
    Перем Путь, Имя;    
    РасположениеФайла(Путь, Имя);    
        
    Если ЗагрузитьВнешнююКомпоненту(Путь + "BinFiles.dll") = 0 Тогда    
        Сообщить("Ошибка загрузки внешней компоненты","!!!");
        Возврат
    КонецЕсли;    
        
    Файл = СоздатьОбъект("AddIn.BinFile");    
        
    Файл.DebugMode = 1;    //Выдавать в окно сообщений информацию о возникающих ошибках
        
    Файл.Open("C:\1.dbf");    
            
    //Сообщить(Файл.HexToStr(Файл.ReadHex(100)));    
    Сообщить(Файл.ReadBin());    
        
    Файл.Close();    
        
КонецПроцедуры        

всеравно не могу понять что использовать
21 Mikeware
 
11.01.14
17:35
(19) Char = Stream.Read(30);
22 Mikeware
 
11.01.14
17:39
точнее, .skip(29) и .read(1)
Ну,  или .read(30), а потом Прав(Строка, 1)
23 sysadminlk
 
11.01.14
17:40
fso=СоздатьОбъект("Scripting.FileSystemObject");
File=fso.getFile(Адрес);        
Stream=File.OpenAsTextStream(1,0);
Сообщить(ТипЗначенияСтр(Stream));
ee = Stream.ReadAll();
Сообщить(ТипЗначенияСтр(ee));
Сообщить(СтрДлина(ee));


возвращает
OLE.ITextStream
Строка
6
24 sysadminlk
 
11.01.14
17:45
fso=СоздатьОбъект("Scripting.FileSystemObject");
File=fso.getFile(Адрес);        
Stream=File.OpenAsTextStream(1,0);
Сообщить(ТипЗначенияСтр(Stream));
Char = Stream.Read(30);
Сообщить(Прав(Char, 1));
Сообщить(ТипЗначенияСтр(Char));
Сообщить(СтрДлина(Char));




OLE.ITextStream

Строка
6
25 sysadminlk
 
11.01.14
17:55
fso=СоздатьОбъект("Scripting.FileSystemObject");
File=fso.getFile(Адрес);        
Stream=File.OpenAsTextStream(1,0);
Stream.skip(29);
Ch = Stream.Read(1);
Сообщить(Ch);


возвращает
W
26 Mikeware
 
11.01.14
17:59
(25) и? я чего тебе еще надо?
27 Mikeware
 
11.01.14
18:04
Кодовая таблица -     Current ANSI CP     ANSI
28 sysadminlk
 
11.01.14
18:08
то что если несколько дбф проверить везде разные значения
W


&
&
29 sysadminlk
 
11.01.14
18:09
кодсимв дает
87
1
1
38
38
30 Mikeware
 
11.01.14
18:15
(28)(29) совершенно верно дает. анси, американскую дос-кодировку, и русскую оем. Ты в (9) ходил? ну первая же ссылка... как так можно, не понимаю....
31 Torquader
 
11.01.14
18:15
32 sysadminlk
 
11.01.14
18:35
Точно! (30) - огромное спасибо!
(31) как раз уже сам нашел :)))

Вот рабочий код:

fso=СоздатьОбъект("Scripting.FileSystemObject");    
File=fso.getFile(Адрес);            
Stream=File.OpenAsTextStream(1,0);    
Stream.skip(29);    
Ch = Stream.Read(1);    
Сообщить(""+КодСимв(Ch)+" "+Адрес+"");

Тут: описание кодовых таблиц
http://www.autopark.ru/ASBProgrammerGuide/DBFSTRUC.HTM#Table_9

Дублирую сюда (на всякий случай).
Идентификатор    Кодовая страница    Описание
1    0x01    437    US MS-DOS
2    0x02    850    International MS-DOS
3    0x03    1252    Windows ANSI Latin I
4    0x04    10000    Standard Macintosh
8    0x08    865    Danish OEM
9    0x09    437    Dutch OEM
10    0x0A    850    Dutch OEM*
11    0x0B    437    Finnish OEM
13    0x0D    437    French OEM
14    0x0E    850    French OEM*
15    0x0F    437    German OEM
16    0x10    850    German OEM*
17    0x11    437    Italian OEM
18    0x12    850    Italian OEM*
19    0x13    932    Japanese Shift-JIS
20    0x14    850    Spanish OEM*
21    0x15    437    Swedish OEM
22    0x16    850    Swedish OEM*
23    0x17    865    Norwegian OEM
24    0x18    437    Spanish OEM
25    0x19    437    English OEM (Great Britain)
26    0x1A    850    English OEM (Great Britain)*
27    0x1B    437    English OEM (US)
28    0x1C    863    French OEM (Canada)
29    0x1D    850    French OEM*
31    0x1F    852    Czech OEM
34    0x22    852    Hungarian OEM
35    0x23    852    Polish OEM
36    0x24    860    Portuguese OEM
37    0x25    850    Portuguese OEM*
38    0x26    866    Russian OEM
55    0x37    850    English OEM (US)*
64    0x40    852    Romanian OEM
77    0x4D    936    Chinese GBK (PRC)
78    0x4E    949    Korean (ANSI/OEM)
79    0x4F    950    Chinese Big5 (Taiwan)
80    0x50    874    Thai (ANSI/OEM)
87    0x57    Current ANSI CP    ANSI
88    0x58    1252    Western European ANSI
89    0x59    1252    Spanish ANSI
100    0x64    852    Eastern European MS-DOS
101    0x65    866    Russian MS-DOS
102    0x66    865    Nordic MS-DOS
103    0x67    861    Icelandic MS-DOS
104    0x68    895    Kamenicky (Czech) MS-DOS
105    0x69    620    Mazovia (Polish) MS-DOS
106    0x6A    737    Greek MS-DOS (437G)
107    0x6B    857    Turkish MS-DOS
108    0x6C    863    French-Canadian MS-DOS
120    0x78    950    Taiwan Big 5
121    0x79    949    Hangul (Wansung)
122    0x7A    936    PRC GBK
123    0x7B    932    Japanese Shift-JIS
124    0x7C    874    Thai Windows/MS–DOS
134    0x86    737    Greek OEM
135    0x87    852    Slovenian OEM
136    0x88    857    Turkish OEM
150    0x96    10007    Russian Macintosh
151    0x97    10029    Eastern European Macintosh
152    0x98    10006    Greek Macintosh
200    0xC8    1250    Eastern European Windows
201    0xC9    1251    Russian Windows
202    0xCA    1254    Turkish Windows
203    0xCB    1253    Greek Windows
204    0xCC    1257    Baltic Windows
* - вторая (международная) кодовая страница


А у меня дбф файлы получились в такой кодировке:
87    Current     ANSI CP    ANSI
1    437        US MS-DOS
1    437        US MS-DOS
38    866        Russian OEM


ОГРОМНОЕ спасибо Mikeware за помощь :) !!!
33 sysadminlk
 
11.01.14
21:23
Забыл добавить
Stream.Close();
34 Torquader
 
11.01.14
21:32
(33) Оно само закроется, когда переменную очистишь.
А вот, если не очистить, то dbf-файл просто не откроется.
35 sysadminlk
 
11.01.14
21:36
(34) после Stream.Close();
файл открывается нормально (без пометки только чтение)
а если Stream.Close(); не делать
тогда дбф открывается только на чтение,
а просто так не открывается
36 sysadminlk
 
11.01.14
21:42
Длина имени файла превысила 8 символов

Решение:

Функция ПолучитьКороткийПутьКФайлу(ДлинныйПуть)    
    ФСО = СоздатьОбъект("Scripting.FileSystemObject");
    Файл = ФСО.GetFile(ДлинныйПуть);
    КороткийПуть = Файл.ShortPath;
    Файл = "";
    ФСО = "";
    Возврат КороткийПуть;
КонецФункции