Имя: Пароль:
1C
 
AnsiToOem
0 SlavikSOFT2000
 
24.01.11
11:09
Пробема:
Есть строка в кодировке 1С8 UTF нужно ее превратить в строку OEM
В 77 была функция AnsiToOem а в 8 ее нет

есть какие-нибуть идеи? (Только  без работы с диском)
1 oleg_km
 
24.01.11
11:50
других идей не нашел или реализовать во внешней обработке или COM-DLL. Только AnsiToOem не преобразует UTF в OEM, она преобразует ANSI в OEM
2 SlavikSOFT2000
 
24.01.11
12:04
а не хочется ужастно
3 H A D G E H O G s
 
24.01.11
12:07
Зачем?
4 Salvador Limones
 
24.01.11
12:08
Я бы предложил примерно так:
Текст = Новый ТекстовыйДокумент;
Текст.УстановитьТекст(ИсхСтрока);
Текст.Записать("c:\temp.txt",КодировкаТекста.OEM);
Текст.Прочитать("c:\temp.txt",КодировкаТекста.ANSI);
5 Дикообразко
 
24.01.11
12:09
как вариант

Встроенные функции языка (Script functions)
Символ (Char)
Синтаксис:
Символ(<Код символа>)
Параметры:
<Код символа> (обязательный)
Тип: Число. Код получаемого символа. Код задается в соответствии с кодировкой Unicode.
Возвращаемое значение:
Тип: Строка. Результирующий символ.
Описание:
Преобразует код символа в строку, содержащую символ.
Пример:
Буква_Я = Символ(1103);

Встроенные функции языка (Script functions)
КодСимвола (CharCode)
Синтаксис:
КодСимвола(<Строка>, <Номер символа>)
Параметры:
<Строка> (обязательный)
Тип: Строка. Исходная строка.
<Номер символа> (необязательный)
Тип: Число. Номер символа в строке, код которого необходимо получить. Нумерация символов в строке начинается с 1.
Значение по умолчанию: 1
Возвращаемое значение:
Тип: Число. Код переданного символа. Код возвращается в соответствии с кодировкой Unicode.
Описание:
Получает код символа, расположенного в переданной строке в позиции с указанным номером.
Пример:
КодПервогоСимволаФамилии = КодСимвола(Сотрудник.Фамилия);
6 Дикообразко
 
24.01.11
12:09
(4) и что будет?
7 H A D G E H O G s
 
24.01.11
12:11
(6) Зависит от того, что нужно автору.
Если просто строку OEM в 1С поиметь - то ничего.
8 SlavikSOFT2000
 
24.01.11
12:11
(4) с записью на диск я и сам могу
в теме ж указано - "есть какие-нибуть идеи? (Только  без работы с диском)"
9 H A D G E H O G s
 
24.01.11
12:12
(8) Еще раз
ЗАЧЕМ
10 Salvador Limones
 
24.01.11
12:13
(8) А, точняк, не заметил.
11 Дикообразко
 
24.01.11
12:15
(7) ну оно же не должно перекодировать, абракадабра же получится?
12 SlavikSOFT2000
 
24.01.11
12:16
(9) чтобы дальше передать через драйвер , а он токо оем рулит
13 H A D G E H O G s
 
24.01.11
12:16
(11) Как минимум, тогда
Текст = Новый ТекстовыйДокумент;
Текст.УстановитьТекст(ИсхСтрока);
Текст.Записать("c:\temp.txt",КодировкаТекста.OEM);
Текст.Прочитать("c:\temp.txt",КодировкаТекста.UTF);
14 SlavikSOFT2000
 
24.01.11
12:17
(7) - драйвер напрямую работает с ком портом
строки будут разные так как в них будет наименование товара
15 H A D G E H O G s
 
24.01.11
12:17
(12) Смотрим (5)
16 Дикообразко
 
24.01.11
12:17
(12)
'/******************************************/
'/*   Перекодировка символа                */
'/******************************************/
Function CharOEMtoANSI(symbol)
   Dim code
   Dim res
       code=Asc(symbol)
       if ((code>=128) and (code<=175)) then
       res = Chr(code+64)
       elseif ((code>=224) and (code<=239)) then
             res= Chr(code+16)
       else
             res = symbol
       end if
   CharOEMtoANSI=res
end Function
'/******************************************/
Function CharANSItoOEM(symbol)
   Dim code
   Dim res
       code=Asc(symbol)
       if ((code>=176) and (code<=239)) then
       if(code=185) then
                 res= Chr(code+67)
       else
                 res= Chr(code-64)
       end if
       elseif ((code>=240) and (code<=255)) then
             res= Chr(code-16)
        else
             res= symbol
       end if
       CharANSItoOEM=res
end Function
'/******************************************/
'/*   Перекодировка строки                 */
'/******************************************/
Function OEMtoANSI(st)
   Dim i
   Dim slen
   Dim tmp
   slen=Len(st)
   i=0
   tmp=""
       While(i<sLen)
             i=i+1
             tmp=tmp+CharOEMtoANSI(Mid(st,i,1))
       wend
       OEMtoANSI=tmp
end Function

Function ANSItoOEM(st)
   Dim i
   Dim slen
   Dim tmp
   slen=Len(st)
   i=0
   tmp=""
       While(i<sLen)
             i=i+1
             tmp=tmp+CharANSItoOEM(Mid(st,i,1))
       wend
       ANSItoOEM=tmp
end Function
'/******************************************/


перепиши в 1С, используя (5)
17 SlavikSOFT2000
 
24.01.11
12:18
команд будет много - не хочется диск напрягать
18 H A D G E H O G s
 
24.01.11
12:18
Писец

Ansi<>utf

Даже рядом не лежало
19 H A D G E H O G s
 
24.01.11
12:20
В 1C - utf - 2 байта на символ
ANSI - Win1251 - 1 байт на символ
20 SlavikSOFT2000
 
24.01.11
12:20
(16) - спс
21 Дикообразко
 
24.01.11
12:20
(13) что то мне не верится, надо проверить
25 H A D G E H O G s
 
24.01.11
12:22
26 Дикообразко
 
24.01.11
12:23
(23) да ну баян же страшный...
на то он и юникод, что бы с кучей таблицей кодировок не парится, поэтому 2 байта 65 535 возможных символов
вместо 255 в оем и анси
27 H A D G E H O G s
 
24.01.11
12:25
(26) Аутор говорит про
ansitooem()
бекоуз в 7.7 не было utf, а было ansi

Это - восьмерка! (Это - спарта!)

Тут нужен аналог
widechartomultibyte()
28 Дикообразко
 
24.01.11
12:26
(27) ты гонишь... нафиг тебе вообще utf ?
29 H A D G E H O G s
 
24.01.11
12:27
Итого:
Либо
1) В файл
2) Конверъебиться с Символ()
3) Вызов АПИ widechartomultibyte()
30 H A D G E H O G s
 
24.01.11
12:28
(28) Автор формирует текст в 1Сv8. Он изначально будет в utf
31 Дикообразко
 
24.01.11
12:29
32 SlavikSOFT2000
 
24.01.11
12:31
(16) Таки не работает к сожалению
Потому что код символа "А" - 1040
33 Дикообразко
 
24.01.11
12:32
(32) тогда это не ANSI
34 H A D G E H O G s
 
24.01.11
12:33
(32) (33)
Внезапно!
35 SlavikSOFT2000
 
24.01.11
12:33
ну 1С8 всетаки блин в УТФ
36 SlavikSOFT2000
 
24.01.11
12:33
нужна тогда функция UTFtoOEM :-)
37 Дикообразко
 
24.01.11
12:35
(36) посмотри (31) там народ извращался, может что найдешь полезного
38 Fram
 
24.01.11
12:38
(0) через файл. только не каждую фразу, а все фразы одним файлом. немного больше кода, зато быстро
39 SlavikSOFT2000
 
24.01.11
13:46
проблема в том что при чтении этого файла 1С опять получает строку в UTF

а код имеет вид:

Ответ = ФискальныйПринтер.command(ТекстКоманды);
Как передать тогда ТекстКоманды в оем?
40 Fram
 
24.01.11
13:56
(39) кусок кода выложи
41 Fram
 
24.01.11
13:58
+ (40) в смысле побольше кусок
42 Fram
 
24.01.11
13:59
и пример в каком случае печатает правильно? что напечатает, если сделать, например , так:
Ответ = ФискальныйПринтер.command("Я фискальный принтер");
43 H A D G E H O G s
 
24.01.11
14:05
Счаст все будет так,как ты захочешь.
45 H A D G E H O G s
 
24.01.11
14:14
Команда="Testing navigation system";
КомандаНаПорт="";
НакопленныйКодСимвола=0;
Для Счетчик=1 По СтрДлина(Команда) Цикл
   КодСимволаUTF=КодСимвола(Сред(Команда,Счетчик,1));
   КодСимволаOEM=СконвертироватьКодUTFвOEM(КодСимволаUTF);
   Если Счетчик%2=0 Тогда
       НакопленныйКодСимвола=НакопленныйКодСимвола+КодСимволаOEM;
       КомандаНаПорт=КомандаНаПорт+Символ(НакопленныйКодСимвола);
       НакопленныйКодСимвола=0;
   Иначе
       НакопленныйКодСимвола=НакопленныйКодСимвола+КодСимволаOEM*255;
   КонецЕсли;
КонецЦикла;
Если НакопленныйКодСимвола<>0 Тогда
   КомандаНаПорт=КомандаНаПорт+Символ(НакопленныйКодСимвола*255);
КонецЕсли;
46 H A D G E H O G s
 
24.01.11
14:14
Вот, как то так
47 H A D G E H O G s
 
24.01.11
14:16
Смысл - в Строку 1С (utf) - записать символы.
Каждый символ - это набор 2-х байт.
1 байт - это байт первого OEM символа исходной строки
2 байт - это байт второго OEM символа исходной строки
48 H A D G E H O G s
 
24.01.11
14:17
Тоесть, 2 символа исходной команды помещаются в 1 символ строки 1С
49 SlavikSOFT2000
 
24.01.11
14:21
проверим щас :-)
50 SlavikSOFT2000
 
24.01.11
15:13
так не пройдет к сожалению
51 SlavikSOFT2000
 
24.01.11
15:13
не прошло тоесть
52 Fram
 
24.01.11
15:13
(50) а что на (42) выдает?
53 H A D G E H O G s
 
24.01.11
15:14
(51) Почему?
54 Fram
 
24.01.11
15:17
ну такая команда вряд ли есть конечно :) . Ну написал бы хотя бы что работает
55 SlavikSOFT2000
 
24.01.11
15:22
(53) -символы принимает - говорит Ок
как вариант возможно компонента реализована паршиво

(42) - ФП не может такой текст вообще отобразить
а вот например на букву "С" руск. не реагирует и все
56 H A D G E H O G s
 
24.01.11
15:39
(55) ВК-шки нормально конвертят нормальный uft в ansi
Самостоятельно.

Дельфи точно это делает.
57 Fram
 
24.01.11
15:46
я так и не понял.. из 1С хоть какая нибудь команда срабатывает?
58 SlavikSOFT
 
24.01.11
16:14
команды не в руск раскладке а в англ - соответственно проблем нет
59 SlavikSOFT
 
24.01.11
16:14
а вот наименование товаров в русс - проблемы есть
60 Fram
 
24.01.11
16:18
(59) а вот такое проходит? "агббЄЁ©"