Имя: Пароль:
1C
1C 7.7
v7: Как записать текст в кодировке UTF-8?
, ,
0 katerinaUniv
 
20.02.15
09:14
Доброго времени суток! Пытаюсь записать текстовые составляющие в xml в кодировке UTF-8, в итоге при открытии файла вместо, например, наименования контрагента кракозябры. Использую метод ANSITOOEM(). До этого использовала встроенную функцию с таким кодов:

Длина=СтрДлина(Стр);  
    Итог="";
    Для Н=1 По Длина Цикл
        Знак=Сред(Стр,Н,1);
        Код=КодСимв(Знак);
        Если Код<128 Тогда  
            //Изменено АйТи-Штурман - начало
            Если (код = 42) Или (код = 36) Или (код = 40) Или (код = 41) Тогда
                Продолжить;
                //не берем * и $
            Иначе
                Итог=Итог+Знак;
            КонецЕсли;
            //Изменено АйТи-Штурман - конец
        Иначе
            Если (Код>=КодСимв("А"))И(Код<=КодСимв("п")) Тогда
                Итог=Итог+Симв(208)+Симв(144+Код-КодСимв("А"));
            ИначеЕсли (Код>=КодСимв("р"))И(Код<=КодСимв("я")) Тогда
                Итог=Итог+Симв(209)+Симв(128+Код-КодСимв("р"));
            ИначеЕсли (Знак="ё") Тогда
                Итог=Итог+Симв(209)+Симв(145);
            ИначеЕсли (Знак="Ё") Тогда
                Итог=Итог+Симв(208)+Симв(129);
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    Возврат Итог;

Выгружаю файл из ТИС 7.7 сильно доработанной, Клиент-сервер MS SQL
1 katerinaUniv
 
20.02.15
09:15
помогите, если кому не сложно и кто сталкивался
2 1Сергей
 
20.02.15
09:18
воспользуйся лучше TextStream
3 katerinaUniv
 
20.02.15
09:28
(2) так?
ADODBStream = CreateObject("ADODB.Stream");

ADODBStream.Type = 2;
ADODBStream.Charset = "windows-1251";
ADODBStream.Open();
ADODBStream.LoadFromFile(стр);

Text = ADODBStream.ReadText(стр);
ADODBStream.Close();
ADODBStream.Charset = "UTF-8";
ADODBStream.Open();
ADODBStream.WriteText(Text);
ADODBStream.SaveToFile (итог, 2);
ADODBStream.Close();        
возврат итог;
4 Cube
 
20.02.15
09:29
Процедура СменитьКодировкуФайлаНаUTF8(ИмяФайла)
    
    Байт = 255;
    СтримВход = СоздатьОбъект("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));
    КонецЦикла;
    СтримВыход.SaveToFile(ИмяФайла, 2);
    
КонецПроцедуры //СменитьКодировкуФайлаНаUTF8()
5 katerinaUniv
 
20.02.15
09:31
так мне надо строкое значение в xml поменять
6 katerinaUniv
 
20.02.15
09:33
(4)где можно почитать о методах этого объекта, мне надо строковое значение сконвертировать в UTF-8 и кинуть в xml
7 ДенисЧ
 
20.02.15
09:46
(6) Извините, а в Астрахани гугль запрещён?
8 katerinaUniv
 
20.02.15
10:03
(7) ищу уже давно, но не получается
9 vasbur
 
20.02.15
10:04
(8) в MSDN надо искать
10 igork1966
 
20.02.15
10:06
Что это было?  ;-()
11 katerinaUniv
 
20.02.15
10:07
(9) нашла вот такой вариант: есть exe файл, который перекодирует все в utf
12 katerinaUniv
 
20.02.15
10:07
(9) теперь вопрос: как запустить exe из обработки?
13 igork1966
 
20.02.15
10:24
Я чего-то не пойму... а чем v7plus.dll не устраивает?
Зачем такие пляски с бубном?
14 Pers0naGrata
 
20.02.15
10:30
<code>
Функция глПреобразоватьСтрокуВ_UTF8( Стр ) Экспорт

    Итог = "";
    
    Длина = СтрДлина( Стр );
    Для Сч = 1 По Длина Цикл
        Знак = Сред( Стр, Сч, 1 );
        Код  = КодСимв( Знак );
        Если Код < 128 Тогда
            Итог = Итог + Знак;
        Иначе
            Если ( Код >= КодСимв( "А" ) )
               И ( Код <= КодСимв( "п") ) Тогда
                Итог = Итог + Симв( 208 ) + Симв( 144 + Код - КодСимв( "А" ) );
            ИначеЕсли ( Код >= КодСимв( "р" ) )
                    И ( Код <= КодСимв( "я" ) ) Тогда
                Итог = Итог + Симв( 209 ) + Симв( 128 + Код - КодСимв( "р" ) );
            ИначеЕсли Знак = "ё" Тогда
                Итог = Итог + Симв( 209 ) + Симв( 145 );
            ИначеЕсли Знак="Ё" Тогда
                Итог = Итог + Симв( 208 ) + Симв( 129 );
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
    Возврат Итог;
    
КонецФункции // глПреобразоватьСтрокуВ_UTF8

Функция глПреобразоватьСтрокуИзUTF8( Стр ) Экспорт

    Итог = "";
    
    Длина = СтрДлина( Стр );
    Для Сч = 1 По Длина Цикл
        Знак = Сред( Стр, Сч, 1 );
        Код  = КодСимв( Знак );
        Если Код < 128 Тогда
            Итог = Итог + Знак;
        ИначеЕсли ( Код >= 128 )
                И ( Код < 192 ) Тогда
        Иначе
            Сч = Сч + 1;
            Знак2 = Сред( Стр, Сч, 1 );
            Код2  = КодСимв( Знак2 );
            Если Код = 208 Тогда
                Если Код2 = 129 Тогда
                    Итог = Итог + "Ё";
                Иначе
                    Итог = Итог + Симв( КодСимв( "А" ) + Код2 - 144 );
                КонецЕсли;
            ИначеЕсли Код = 209 Тогда
                Если Код2 = 145 Тогда
                    Итог = Итог + "ё";
                Иначе
                    Итог = Итог + Симв( КодСимв( "р" ) + Код2 - 128 );
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
    Возврат Итог;
    
КонецФункции // глПреобразоватьСтрокуИзUTF8
</code>
15 katerinaUniv
 
20.02.15
10:35
(14) такое пробовала, не помогло. сейчас не стала выполнять перекодировку, начал файл открываться с ошибкой на строку 5 колонку 23. это получается буква "В". Если файл перекодировать (запускаю exe из командной строки), то все равно та же ошибка. начало файла выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<DISTR_CONN_ID ID="022">
   <CUSTOMER>
      <SOLD_TO>
         <CLIENT_CODE>ВБО01643</CLIENT_CODE>
         <STATUS>0</STATUS>
         <CLIENT_NAME>  Абраева(рАСШИФрОВАТЬ)</CLIENT_NAME>
         <INN></INN>
         <KPP></KPP>
         <CREDIT_LIMIT>0</CREDIT_LIMIT>
         <TIME_LIMIT>0</TIME_LIMIT>
         <PRICE_LIST_TYPE>T</PRICE_LIST_TYPE>
         <PRICE_LIST_DESCR></PRICE_LIST_DESCR>
         <ADDRESS>
            <COUNTRY CODE="RU" NAME="Россия" />
            <REGION CODE="83009239-25cb-4561-af8e-7ee111b1cb73" NAME="Астраханская обл" />
            <CITY CODE="" NAME="" />

раньше ругался файл на символы * $
16 katerinaUniv
 
20.02.15
10:40
(15) вот текст ошибки
error on line 5 at column 23: Encoding error
17 katerinaUniv
 
20.02.15
10:56
я уже и не знаю, что пробовать
18 Pers0naGrata
 
20.02.15
11:29
Попробовал
<code>
Текст = СоздатьОбъект( "Текст" );
Текст.КодоваяСтраница( 0 );
Текст.ДобавитьСтроку( глПреобразоватьСтрокуВ_UTF8( "<CLIENT_CODE>ВБО01643</CLIENT_CODE>" ) );
Текст.Записать( "E:/temp.txt" );
</code>
Открываю. Все замечательно: файл в кодировке UTF8.
19 katerinaUniv
 
20.02.15
14:12
(18)тупила, признаю... ошибка была в том, что передавались значения типа null
20 katerinaUniv
 
20.02.15
14:12
большое спасибо за помощь и примеры!!!
21 Torquader
 
22.02.15
01:17
А в чём проблема в написании через стандартную запись текста ? В том, что русские буквы нужно переводить ?
22 ДенисЧ
 
22.02.15
09:21
(21) в том, что тема в разделе 77 )
А там нету ни ЗаписиТекста, ни уникода.
23 spectre1978
 
22.02.15
09:31
Ребят, а зачем так хлопотно-то? Я всегда делал в семерке вот так

Парсер = СоздатьОбъект ("AddIn.XMLParser");
Док = Парсер.СоздатьДокумент ();
Док.Кодировка = "utf-8";
    
Док.ЗагрузитьИзСтроки ("<?xml version=""1.0"" encoding=""utf-8"" standalone=""yes"" ?> <XML> </XML>");
Корень = Док.ВыбратьУзел ("XML");
... действия по заполнению документа. Передаем обычные
... семерочные строки без какой-либо конвертации
Док.Записать (ИмяФайла);

и все получалось в той кодровке какой надо. Ведь V7Plus парсер это просто обертка над MS XML Parser, и вполне оно UTF8 умеет.
24 igork1966
 
22.02.15
10:43
(23) я их еще в (13) об этом спросил... но пути изобретателей велосипедов неисповедимы  ;-)
25 Torquader
 
22.02.15
15:17
(22) Так я вижу, что семёрка.
т=СоздатьОбъект("Текст");
т.ДобавитьСтроку(РусскиеВДваСимвола(лстр));

В функции
Функция РусскиеВДваСимвола(пстр)
лчД=СтрДлина(пстр);
лстрРез="";
Для лч=1 По лчД Цикл
  лчКод=КодСимвола(Сред(пстр,лч,1));
  Если лчКод<128 Тогда
   лстрРез=лстрРез+Симв(лчКод);
  Иначе
   лстрРез=лстрРез+ммПереводСимвола(лчКод-127);
  КонецЕсли;
КонецЦикла;
Возврат лстрРез;
КонецФункции

Просто, в Unicode стандартными методами не записать, так как семёрка не умеет записывать символ с кодом 0, а в UTF-8 таковые и не нужны.

Удачи.