Имя: Пароль:
1C
1C 7.7
v7: Еще один метод преобразования в UTF-8 (с побочным явлением)
, , ,
0 smaharbA
 
04.08.11
00:55
Так примерно

Функция Юникоды(Знач Стр="")
   Перем ХТМЛ,Замена,Это;
   Попытка
       Это=СоздатьОбъект("OlePrn.OleCvt");
       Стр=Это.EncodeUnicodeName(Стр);
       Замена="~0";
   Исключение
       ХТМЛ = СоздатьОбъект("htmlfile");
       ХТМЛ.Open("text/html");
       ХТМЛ.Write("<script></script>");
       Стр=ХТМЛ.script.escape(Стр);
       Замена="%u";
   КонецПопытки;
   Для Сч=-2 По -1 Цикл
       Стр=СтрЗаменить(Стр,Лев(Замена,-Сч),"" "");
   КонецЦикла;
   Возврат Нрег(Стр);
КонецФункции    // Юникоды(Стр="")

Функция ШестнадцатьДесять(Стр=0)
   Перем х,Код,Сч;
   х=1;Код=0;
   Для Сч=-СтрДлина(Стр) По -1 Цикл
       Код=Найти("123456789abcdef",Сред(Стр,-Сч,1))*х+Код;
       х=х*16;
   КонецЦикла;
   Возврат Код;
КонецФункции    // ШестнадцатьДесять(Стр=0)
//*******************************************
Процедура Сформировать()
   Стр="Вася Пупкин";
   УТФ8="";
   Стр=Юникоды(Стр);
   Для Сч=1 По СтрКоличествоСтрок(Стр) Цикл
       Код=ШестнадцатьДесять(СтрПолучитьСтроку(Стр,Сч));
       Если Код<128 Тогда
           УТФ8=УТФ8+Симв(Код);
       Иначе
           Если Код<2048 Тогда
               УТФ8=УТФ8+Симв(192 + Цел(Код / 64))+Симв(128 + Код % 64);
           Иначе
               УТФ8=УТФ8+Симв(224 + Цел(Код / 4096))+Симв(128 + Цел((Код % 64) / 64))+Симв(128 + Цел((Код % 64) % 64));
           КонецЕсли;
       КонецЕсли;
   КонецЦикла;
   Сообщить(УТФ8);
   Текст=СоздатьОбъект("Текст");
   Текст.ДобавитьСтроку(УТФ8);
   Текст.Записать("c:\Вася Пупкин.утф8");
КонецПроцедуры
1 zak555
 
04.08.11
00:57
зачем всё это ?
2 Cthulhu
 
04.08.11
01:13
а ИЗ утф-8 "ещё один" какой-нибудь, пошустрее?..
3 Torquader
 
04.08.11
01:14
Ну и что такого сложного в UTF-8 ?
Там же нулевой символ является завершением строки, как и в 1С - то есть ходить по граблям не надо, а преобразование кодов символов с кодами старше 127 в семёрке проходит на ура.
Так что можно хоть в UTF-8, хоть обратно, но только с перебором символов.
P.S. а если на форму положить WebBrowser, то ещё и отображать UFT-8 можно и в базе хранить.
4 Злопчинский
 
04.08.11
03:06
ничего не понядл, но в базу знаний свою отложил... у меня работает какая-то функция одна.. вроде нормуль...
5 kittystark
 
04.08.11
03:15
(2) вот

Процедура ИзменитьКодовуюСтраницуФайла( имяФайла, исходнКодировка, нужнаяКодировка )
   
   Если ФС.СуществуетФайл( имяФайла ) = 0 Тогда
       Сообщить("Файл " + имяФайла + " - не найден! Изменение кодировки отменено.","!");
       возврат;
   КонецЕсли;
       
   ScrptCtrl=СоздатьОбъект("MSScriptControl.ScriptControl");
   ScrptCtrl.Language="VBScript";
   ScrptCtrl.AddCode("
   |Function StrConv(Text,SourceCharset,DestCharset)
   |    Set Stream=CreateObject(""ADODB.Stream"")
     |    Stream.Type=2
     |    Stream.Mode=3
     |    Stream.Open
     |    Stream.Charset=DestCharset
     |    Stream.WriteText Text
     |    Stream.Position=0
     |    Stream.Charset=SourceCharset
     |    StrConv=Stream.ReadText
   |End Function
   |
   |sub ConvertCodepage( fileName, SourceCharset, DestCharset )
   |    set fs = CreateObject(""Scripting.FilesystemObject"")
   |    originalText = fs.openTextFile(fileName,1).readAll()
   |    convertedText = strConv(originalText, SourceCharset, DestCharset )
   |    fs.openTextFile(fileName,2,true).write(convertedText)
   |end sub
   |
   |");
   
   Module        = ScrptCtrl.Modules("Global");
   CodeObject    = Module.CodeObject;
   CodeObject.ConvertCodepage( имяФайла, исходнКодировка, нужнаяКодировка);
КонецПроцедуры


примеры параметров-кодировок:
"UTF-8"
"KOI8-R"
"Windows-1251"
"ISO-8859-5"
6 kittystark
 
04.08.11
04:50
(0) а не проще было бы
стрUTF8 = СоздатьОбъект("OlePrn.OleCvt").ToUtf8(стр);
7 Мутабор
 
04.08.11
05:07
(0) Никого не слушай, пиши исчо, я твои примеры всегда читаю и польза от них есть.
8 Мутабор
 
04.08.11
05:20
9 smaharbA
 
04.08.11
06:35
(5) со стримом все гораздо просче 6 строк кода адинес
10 smaharbA
 
04.08.11
06:36
(6) не сработает
11 Мутабор
 
04.08.11
06:45
12 Simod
 
04.08.11
07:15
(0) Вот эта часть:

Цел((Код % 64) / 64)

всегда возвращает 0. К чему она?
13 smaharbA
 
04.08.11
07:46
(11) "translate a string of Unicode characters to the UTF-8 format"

(12) Да, там должно быть
УТФ8=УТФ8+Симв(224 + Цел(Код / 4096))+Симв(128 + Цел((Код % 4096) / 64))+Симв(128 + Цел((Код % 4096) % 64));
14 smaharbA
 
04.08.11
07:46
поправить бы сабж
15 kittystark
 
04.08.11
10:00
(9) код в студию, плиз