![]() |
|
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; Файл = ""; ФСО = ""; Возврат КороткийПуть; КонецФункции |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |