Демонстрация перекодировки текста в/из UTF-8 штатными средствами 1с 7.7
На полную универсальность не претендует, но с русскими буквами работает нормально.
Добавлена поддержка букв Ёё.
Собственно функции перекодировки:
Функция ПреобразоватьСтрокуВУТФ8(Стр)
Длина=СтрДлина(Стр);
Итог="";
Для Н=1 По Длина Цикл
Знак=Сред(Стр,Н,1);
Код=КодСимв(Знак);
Если Код<128 Тогда
Итог=Итог+Знак;
Иначе
Если (Код>=КодСимв("А"))И(Код<=КодСимв("п")) Тогда
Итог=Итог+Симв(208)+Симв(144+Код-КодСимв("А"));
ИначеЕсли (Код>=КодСимв("р"))И(Код<=КодСимв("я")) Тогда
Итог=Итог+Симв(209)+Симв(128+Код-КодСимв("р"));
ИначеЕсли (Знак="ё") Тогда
Итог=Итог+Симв(209)+Симв(145);
ИначеЕсли (Знак="Ё") Тогда
Итог=Итог+Симв(208)+Симв(129);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат Итог;
КонецФункции
Функция ПреобразоватьСтрокуИзУТФ8(Стр)
Длина=СтрДлина(Стр);
Итог="";
Для Н=1 По Длина Цикл
Знак=Сред(Стр,Н,1);
Код=КодСимв(Знак);
Если Код<128 Тогда
Итог=Итог+Знак;
ИначеЕсли (Код>=128)И(Код<192) Тогда
Иначе
Н=Н+1;
Знак2=Сред(Стр,Н,1);
Код2=КодСимв(Знак2);
Если Код=208 Тогда
Если Код2=129 Тогда Итог=Итог+"Ё";
Иначе Итог=Итог+Симв(КодСимв("А")+Код2-144);
КонецЕсли;
ИначеЕсли Код=209 Тогда
Если Код2=145 Тогда Итог=Итог+"ё";
Иначе Итог=Итог+Симв(КодСимв("р")+Код2-128);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат Итог;
КонецФункции
За штатное плюс! Хорошая идея.
Так проверить-то легко 🙂 —
формируешь длинный текст из всех возможных печатаемых символов Вин-кодировки код > 31 и <256), преобразуешь его в UTF, далее преобразуешь его обратно в Вин, и сравниваешь полученную строку с исходной.
Если есть различия, значит, прога неверна 🙂
Спасибо автору. Очень даже выручило)
Поставим плюс, может когда-нибудь пригодится
вот только в начале любого файла в UTF-8 есть такие символы п»ї и если пользоватся этими функциями то он урезает некоторую часть строки.
Для автора. Есть такой вполне даже штатный для виндов объект: ADODB.Stream. И у этого объекта есть параметр Charset, задающий кодировку.
http://msdn.microsoft.com/en-us/library/ms808793.aspx
Попробуй.
(5) наверно это BOM-символ, который показывает, какая кодировка идет дальше. И для utf=8 он применяется не всегда.
http://ru.wikipedia.org/wiki/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4
Проверку добавить легко, шестнадцатеричные коды EF BB BF
(6) ИМХО чтобы записать/прочитать небольшой текстик, содержащий заведомо только ASCII+русские буквы, мой способ будет быстрее и надежнее
Вот вариант, учтывающий символы, кодируемые более чем 2 байтами. Просто пропускает их. Должно помочь от BOM.
Функция ПреобразоватьСтрокуИзУТФ8(Стр)
Длина=СтрДлина(Стр);
Итог=»»;
Для Н=1 По Длина Цикл
Знак=Сред(Стр,Н,1);
Код=КодСимв(Знак);
Если Код<128 Тогда
Итог=Итог+Знак;
ИначеЕсли (Код>=128)И(Код<192) Тогда
Иначе
Н=Н+1;
Знак2=Сред(Стр,Н,1);
Код2=КодСимв(Знак2);
Если Код=208 Тогда
Итог=Итог+Симв(КодСимв(«А»)+Код2-144);
ИначеЕсли Код=209 Тогда
Итог=Итог+Симв(КодСимв(«р»)+Код2-128);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат Итог;
КонецФункции
(2) Это необходимо, но недостаточно.
Для текста из русских букв не хватает преобразования двух символов: Ё и ё.
круто, давно искал как это сделать!
(10) добавил
(12) Как ни странно, но есть ещё один «русский» символ — №, который в алфавит не входит, но может набираться на русской раскладке клавиатуры.
для украинского языка можно добавить
———-
Иначе
Если (Код>=КодСимв(«А»))И(Код<=КодСимв(«п»)) Тогда
Итог=Итог+Симв(208)+Симв(144+Код-КодСимв(«А»));
ИначеЕсли (Код>=КодСимв(«р»))И(Код<=КодСимв(«я»)) Тогда
Итог=Итог+Симв(209)+Симв(128+Код-КодСимв(«р»));
ИначеЕсли (Знак=»ё») Тогда
Итог=Итог+Симв(209)+Симв(145);
ИначеЕсли (Знак=»Ё») Тогда
Итог=Итог+Симв(208)+Симв(129);
ИначеЕсли (Знак=»і») Тогда
Итог=Итог+Симв(208)+Симв(150);
ИначеЕсли (Знак=»ї») Тогда
Итог=Итог+Симв(208)+Симв(151);
КонецЕсли;
КонецЕсли;
———
ИначеЕсли Код=209 Тогда
Если Код2=145 Тогда Итог=Итог+»ё»;
ИначеЕсли Код2=150 Тогда Итог=Итог+»і»; // украинская
ИначеЕсли Код2=151 Тогда Итог=Итог+»ї»; // украинская
Иначе
Итог=Итог+Симв(КодСимв(«р»)+Код2-128);
КонецЕсли;
КонецЕсли;
———
Вариант от ssp_ мне больше понравился 🙂
Тем не менее, автору за идею +
Спасибо за обработку! Помогло.
а для 8 нет такой обработки?
Пригодилась обработка, спасибо.
(17) Так функции одинаковые. Если и понадобятся исправления — они будут косметическими.
Пригодилась обработка, спасибо.
Спасибо!
Спасибо, пригодилось.
Добавил вариант для украинских символов І, і, Ї, ї, Є, є
Возможно, наверное, более изящно, но не охоты было возиться.
Показать
Спасибо автору за готовый код — сильно выручил.
Спасибо, очень помогли!
Спасибо, Автору!
Но, замечание в (13) maloi_a, проигнорировали?
Функция преобразования «ПреобразоватьСтрокуВУТФ8» символ номера просто пропускает.
Аналогично поступает и «ПреобразоватьСтрокуИзУТФ8».
Пришлось доработать для символа «№»:
Показать
Божественно! Какие глубинные познания в такой редкой области!