Чтение/запись текста в кодировке UTF-8 из 1c 7.7

Публикация № 18816

Разработка - Универсальные функции

Демонстрация перекодировки текста в/из 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);
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    Возврат Итог;
КонецФункции
 

Скачать файлы

Наименование Файл Версия Размер
-

.1232445296 8,00Kb
479
.1232445296 8,00Kb 479 Скачать бесплатно

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Душелов 3925 20.01.09 13:01 Сейчас в теме
За штатное плюс! Хорошая идея.
2. artbear 1304 20.01.09 13:40 Сейчас в теме
Так проверить-то легко :) -
формируешь длинный текст из всех возможных печатаемых символов Вин-кодировки код > 31 и <256), преобразуешь его в UTF, далее преобразуешь его обратно в Вин, и сравниваешь полученную строку с исходной.
Если есть различия, значит, прога неверна :)
10. maloi_a 07.02.09 10:40 Сейчас в теме
(2) Это необходимо, но недостаточно.
Для текста из русских букв не хватает преобразования двух символов: Ё и ё.
12. ssp_ 147 11.02.09 09:11 Сейчас в теме
13. maloi_a 14.02.09 09:40 Сейчас в теме
(12) Как ни странно, но есть ещё один "русский" символ - №, который в алфавит не входит, но может набираться на русской раскладке клавиатуры.
25. Dima_ 139 26.02.16 14:31 Сейчас в теме
Спасибо, Автору!
Но, замечание в (13) maloi_a, проигнорировали?
Функция преобразования "ПреобразоватьСтрокуВУТФ8" символ номера просто пропускает.
Аналогично поступает и "ПреобразоватьСтрокуИзУТФ8".
Пришлось доработать для символа "№":
Функция ПреобразоватьСтрокуВУТФ8(Стр)
	Стр=СокрЛП(Стр);
	 Длина=СтрДлина(Стр);
	 Итог="";
	 Для Н=1 По Длина Цикл
		 Знак=Сред(Стр,Н,1);
		 Код=КодСимв(Знак);
		 Если Код<128 Тогда
		 	Итог=Итог+Знак;
		 Иначе
		     Если (Код>=КодСимв("А"))И(Код<=КодСимв("п")) Тогда
			     Итог=Итог+Симв(208)+Симв(144+Код-КодСимв("А"));
		     ИначеЕсли (Код>=КодСимв("р"))И(Код<=КодСимв("я")) Тогда
			     Итог=Итог+Симв(209)+Симв(128+Код-КодСимв("р"));
		     ИначеЕсли (Знак="ё") Тогда
			     Итог=Итог+Симв(209)+Симв(145);
		     ИначеЕсли (Знак="Ё") Тогда
			     Итог=Итог+Симв(208)+Симв(129);
		     ИначеЕсли (Знак="№") Тогда
			     Итог=Итог+Симв(226)+Симв(132)+Симв(150);
		     КонецЕсли;
		 КонецЕсли;
	 КонецЦикла;
	 Возврат Итог;
КонецФункции

Функция ПреобразоватьСтрокуИзУТФ8(Стр)
    Длина=СтрДлина(Стр);
    Итог="";
    Для Н=1 По Длина Цикл
        Знак=Сред(Стр,Н,1);
        Код=КодСимв(Знак);
        Если Код<128 Тогда
            Итог=Итог+Знак;
        ИначеЕсли (Код>=128)И(Код<192) Тогда
		Иначе
            Н=Н+1;
            Знак2=Сред(Стр,Н,1);
            Код2=КодСимв(Знак2);
            Если Код=208 Тогда
                Если Код2=129 Тогда Итог=Итог+"Ё";
                Иначе Итог=Итог+Симв(КодСимв("А")+Код2-144);
                КонецЕсли;
            ИначеЕсли Код=209 Тогда
                Если Код2=145 Тогда Итог=Итог+"ё";
                Иначе Итог=Итог+Симв(КодСимв("р")+Код2-128);
                КонецЕсли;
			ИначеЕсли Код=226 Тогда
                Если Код2=132 Тогда 
		            Н=Н+1;
		            Знак3=Сред(Стр,Н,1);
		            Код3=КодСимв(Знак3);
					Если Код3=150 Тогда Итог=Итог+"№";
					КонецЕсли;
                КонецЕсли;
			КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    Возврат Итог;
КонецФункции
Показать
3. NightHawk 22.01.09 07:31 Сейчас в теме
Спасибо автору. Очень даже выручило)
4. jk3 66 23.01.09 14:25 Сейчас в теме
Поставим плюс, может когда-нибудь пригодится
5. coder 23.01.09 15:17 Сейчас в теме
вот только в начале любого файла в UTF-8 есть такие символы п»ї и если пользоватся этими функциями то он урезает некоторую часть строки.
7. ssp_ 147 28.01.09 08:55 Сейчас в теме
(5) наверно это BOM-символ, который показывает, какая кодировка идет дальше. И для utf=8 он применяется не всегда.
Проверку добавить легко, шестнадцатеричные коды EF BB BF
http://ru.wikipedia.org/wiki/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4
6. nickVZ 10 24.01.09 11:56 Сейчас в теме
Для автора. Есть такой вполне даже штатный для виндов объект: ADODB.Stream. И у этого объекта есть параметр Charset, задающий кодировку.
Попробуй.
http://msdn.microsoft.com/en-us/library/ms808793.aspx
One; alexeyburtsev; Whale; +3 Ответить
8. ssp_ 147 28.01.09 09:01 Сейчас в теме
(6) ИМХО чтобы записать/прочитать небольшой текстик, содержащий заведомо только ASCII+русские буквы, мой способ будет быстрее и надежнее
9. ssp_ 147 28.01.09 09:12 Сейчас в теме
Вот вариант, учтывающий символы, кодируемые более чем 2 байтами. Просто пропускает их. Должно помочь от BOM.

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

andriyuksg; sern; ankr; +3 Ответить
11. ArCtic 2 10.02.09 17:29 Сейчас в теме
круто, давно искал как это сделать!
14. Lexus 18.10.11 13:17 Сейчас в теме
для украинского языка можно добавить
----------
Иначе
Если (Код>=КодСимв("А"))И(Код<=КодСимв("п")) Тогда
Итог=Итог+Симв(208)+Симв(144+Код-КодСимв("А"));
ИначеЕсли (Код>=КодСимв("р"))И(Код<=КодСимв("я")) Тогда
Итог=Итог+Симв(209)+Симв(128+Код-КодСимв("р"));
ИначеЕсли (Знак="ё") Тогда
Итог=Итог+Симв(209)+Симв(145);
ИначеЕсли (Знак="Ё") Тогда
Итог=Итог+Симв(208)+Симв(129);
ИначеЕсли (Знак="і") Тогда
Итог=Итог+Симв(208)+Симв(150);
ИначеЕсли (Знак="ї") Тогда
Итог=Итог+Симв(208)+Симв(151);
КонецЕсли;
КонецЕсли;
---------
ИначеЕсли Код=209 Тогда
Если Код2=145 Тогда Итог=Итог+"ё";
ИначеЕсли Код2=150 Тогда Итог=Итог+"і"; // украинская
ИначеЕсли Код2=151 Тогда Итог=Итог+"ї"; // украинская

Иначе
Итог=Итог+Симв(КодСимв("р")+Код2-128);
КонецЕсли;
КонецЕсли;
---------
15. ankr 19 05.12.11 08:15 Сейчас в теме
Вариант от ssp_ мне больше понравился :)
Тем не менее, автору за идею +
16. АндрейКр 128 06.02.12 15:02 Сейчас в теме
Спасибо за обработку! Помогло.
17. 7fortune 07.08.12 20:09 Сейчас в теме
а для 8 нет такой обработки?
18. curdate 25 14.11.12 16:11 Сейчас в теме
Пригодилась обработка, спасибо.
(17) Так функции одинаковые. Если и понадобятся исправления - они будут косметическими.
19. popov_vitaly 14.11.13 11:51 Сейчас в теме
Пригодилась обработка, спасибо.
20. alexeyburtsev 44 21.01.14 11:26 Сейчас в теме
21. Tavalik 2480 20.06.14 10:31 Сейчас в теме
22. Deryni 23 19.08.15 00:17 Сейчас в теме
Добавил вариант для украинских символов І, і, Ї, ї, Є, є
Возможно, наверное, более изящно, но не охоты было возиться.

Функция ПреобразоватьСтрокуВУТФ8(Стр)
    Длина=СтрДлина(Стр);
    Итог="";
    Для Н=1 По Длина Цикл
        Знак=Сред(Стр,Н,1);
        Код=КодСимв(Знак);
        Если Код<128 Тогда
            Итог=Итог+Знак;
		Иначе
			Если (Знак="і") Тогда 
				Итог=Итог+Симв(209)+Симв(150);
			ИначеЕсли (Знак="І") Тогда 
				Итог=Итог+Симв(208)+Симв(134);				
			ИначеЕсли (Знак="ї") Тогда 
				Итог=Итог+Симв(209)+Симв(151);
			ИначеЕсли (Знак="Ї") Тогда 
				Итог=Итог+Симв(208)+Симв(135);
			ИначеЕсли (Знак="є") Тогда 
				Итог=Итог+Симв(209)+Симв(148);
			ИначеЕсли (Знак="Є") Тогда 
				Итог=Итог+Симв(208)+Симв(132);				
            ИначеЕсли (Код>=КодСимв("А"))И(Код<=КодСимв("п")) Тогда
                Итог=Итог+Симв(208)+Симв(144+Код-КодСимв("А"));
            ИначеЕсли (Код>=КодСимв("р"))И(Код<=КодСимв("я")) Тогда
                Итог=Итог+Симв(209)+Симв(128+Код-КодСимв("р"));
            ИначеЕсли (Знак="ё") Тогда
                Итог=Итог+Симв(209)+Симв(145);
            ИначеЕсли (Знак="Ё") Тогда
                Итог=Итог+Симв(208)+Симв(129);
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    Возврат Итог;
КонецФункции

Функция ПреобразоватьСтрокуИзУТФ8(Стр)
    Длина=СтрДлина(Стр);
    Итог="";
    Для Н=1 По Длина Цикл
        Знак=Сред(Стр,Н,1);
        Код=КодСимв(Знак);
        Если Код<128 Тогда
            Итог=Итог+Знак;
        ИначеЕсли (Код>=128)И(Код<192) Тогда
        Иначе
            Н=Н+1;
            Знак2=Сред(Стр,Н,1);
            Код2=КодСимв(Знак2);
            Если Код=208 Тогда
                Если Код2=129 Тогда Итог=Итог+"Ё";
				ИначеЕсли Код2=134 Тогда Итог=Итог+"І";
				ИначеЕсли Код2=135 Тогда Итог=Итог+"Ї";
				ИначеЕсли Код2=132 Тогда Итог=Итог+"Є";
                Иначе Итог=Итог+Симв(КодСимв("А")+Код2-144);
                КонецЕсли;
            ИначеЕсли Код=209 Тогда
                Если Код2=145 Тогда Итог=Итог+"ё";
				ИначеЕсли Код2=150 Тогда Итог=Итог+"і"; // украинская 
				ИначеЕсли Код2=151 Тогда Итог=Итог+"ї"; // украинская 					
				ИначеЕсли Код2=148 Тогда Итог=Итог+"є"; // украинская 					
				Иначе Итог=Итог+Симв(КодСимв("р")+Код2-128);
				КонецЕсли;				
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    Возврат Итог;
КонецФункции
Показать
vtas; avgreen; +2 Ответить
23. One 13.10.15 09:43 Сейчас в теме
Спасибо автору за готовый код - сильно выручил.
24. Helle 25.10.15 08:53 Сейчас в теме
26. Alexander.Dyatchenko 27.04.16 17:44 Сейчас в теме
Божественно! Какие глубинные познания в такой редкой области!
27. alexeyburtsev 44 11.03.20 16:28 Сейчас в теме
Спасибо, пригодилось! (Смотрю - уже не первый раз!)
28. user598273_alex155vid 21.07.20 11:47 Сейчас в теме
Благодарю, очень помогли и сэкономили моё время!
Оставьте свое сообщение

См. также

Загрузка файла json в конфигурации на платформе 1С 7.7

Обработка справочников v7.7 1cv7.md Россия Абонемент ($m)

Внешняя обработка позволяет: открыть файл json, прочитать его, осуществить поиск по элементу справочника и создать/перезаписать элемент справочника.

2 стартмани

27.01.2021    1148    4    GlebBR    2    

Формирование строки json в 1С: 7.7

Практика программирования v7.7 1cv7.md 1С7:Комплекс Абонемент ($m)

Предлагается набор функций 1с 7.7 для формирования строки json стандартными средствами.

1 стартмани

10.12.2018    7605    malovandrey    0    

Сверка СЗВ-СТАЖ и СЗВ-М (платформа 7.7)

Анализ учета Управление персоналом (HRM) Зарплата v7.7 1cv7.md Россия БУ ФОМС, ПФ, ФСС Абонемент ($m)

Обработка сверяет периоды стажа в файле СЗВ-СТАЖ с наличием СНИЛС в файлах ранее сданных отчетов СЗВ-М.

1 стартмани

25.02.2018    11784    12    user856012    4    

Посчитать людей по XML-файлам, выгруженным для ПФ 2010

Обмен через XML Универсальные функции Управление персоналом (HRM) Управление персоналом (HRM) v77::Расчет 1С7:ЗиК БУ НУ ФОМС, ПФ, ФСС Бесплатно (free)

Обработка считает и выводит людей, которые находятся в xml-файлах для пенсионного фонда. Также может служить "рыбой" для дополнительной обработки данных в файлах пенсионного фонда

24.01.2011    13680    82    kserdyukov    1    

Универсальный фильтр

Универсальные функции v77::ОУ v77::БУ v77::Расчет 1cv7.md Бесплатно (free)

Удобный фильтр. Нет необходимости вешать на форму N-ое количество списков значений.

08.07.2010    11695    117    ShEvOvIcH    8    

Обработка для поиска Контрагентов

Поиск данных Универсальные функции Обработка справочников v77::ОУ v77::БУ v77::Расчет 1cv7.md Бесплатно (free)

Не первая и не последняя.. Не лучшая, и не худшая. Просто вариант поиска контрагентов по нескольким словам или их частям в наименовании.

19.05.2010    12216    112    aka AMIGO    7    

Интервал дат прописью

Универсальные функции v7.7 1cv7.md Бесплатно (free)

Иногда возникает необходимость подсчитать количество дней, недель, месяцев или лет в интервале дат и вывести результат прописью. Обработка предназначена для демонстрации работы функции ПолучитьИнтервалДат(Дата1,Дата2,Период) Используется стандартный файл прописи для рублей. Специально не оптимизировал функции, чтобы каждый мог настроить их под свои требования.

15.02.2010    10325    143    Vlan    3    

Альтернатива стандартному предупреждению(вопросу)

Работа с интерфейсом Универсальные функции v77::ОУ v77::БУ v77::Расчет 1cv7.md Бесплатно (free)

Начальство решило, что на предупреждения оформляемые стандартными средствами 1С малоприметны... В результате родилась прикольная штучка... Вывод текста сообщения бАААААльшими буквами, цвет можно задавать. 7 кнопок видимость и текст задаются при вызове Возвращает текст нажатой кнопки..... ВК у нас не применяются...

28.08.2009    12263    69    nikakoy    29    

Напоминалка дня рождения по ИНН

Разное Универсальные функции v77::БУ 1cv7.md Украина Бесплатно (free)

Используя конфигурацию для сельского хозяйства в Украине, понадобилась напоминалка о днях рождения сотрудников. В самой конфигурации не предусмотрено поле "День рождения", но зато есть ИНН, который и был использован для этой цели. Не судите строго, это первая разработка, выложенная мной на Ваш сайт.

01.04.2009    11409    169    stalker    9    

Обработки для сохранения / восстановления данных таблицы значений в БД SQL, txt, xml

Практика программирования Универсальные функции v7.7 1cv7.md Бесплатно (free)

Каждая обработка понимает один формат - ADO / txt / xml На входе - ТЗ, на выходе файл (и наоборот)

05.11.2008    13380    663    ValeriVP    5    

Пакетный ввод на основании без изменения форм и модулей

Универсальные функции v77::ОУ v77::БУ v77::Расчет 1cv7.md Бесплатно (free)

Обработка демонстрирует подход для ввода на основании большого количества документов без правки модулей, с вызовом метода "ОткрытьФорму" - что позволяет не перетягивать код из модуля формы документа, и не менять его...

10.10.2008    24916    1262    Fragster    22    

Конвертер таблиц из 1С (7.7) в MS Office Word

Загрузка и выгрузка в Excel Работа с интерфейсом Универсальные функции v7.7 1cv7.md Бесплатно (free)

Обработка конвертирует печатную форму 1С в формат Word. Преобразование сложных таблиц проходит медленно. Проверено на Word 2003. Объединение - только горизонтальное. Не идеал, но приемлемо. Если нет параметра - открывается демо таблица.

10.12.2007    15828    962    Джуниор    8    

FormEx. Быстрый поиск в поле ввода 2.1

Поиск данных Разработка внешних компонент Универсальные функции v7.7 1cv7.md Бесплатно (free)

Универсальный инструмент пользователя, требует FormEx v2.0.5.0 - http://dorex.pro/?projects&formex&download Реализация механизма быстрого поиска элемента по первым символам непосредственно в поле ввода. Ограничения: Не работает для полей ввода многострочной части.

26.09.2007    19873    722    item    27    

[МФ] Тривиальный шаблон обработки с использованием множественного фильтра (МФ)

Универсальные функции v77::ОУ 1cv7.md Бесплатно (free)

Надоело копи-пастить МФ... Простой шаблон обработки с использованием МФ. На форме - минимально требуемые реквизиты для типового МФ, в коде - обработка этих реквизитов... Т.е. - типа "облагороженный" кусок из кода типовой ТиС для быстрого клонирования для своих обработок

15.09.2006    18086    464    CheBurator    10    

Формирование штрихкодов (EAN-13)

Ценники Универсальные функции Розничная торговля Учет ТМЦ Сканер штрих-кода Розничная торговля Учет ТМЦ v77::ОУ v77::БУ v77::Расчет 1cv7.md Бесплатно (free)

Один из наиболее простых алгоритмов формирования штрихкодов с использованием специализированных шрифтов (BearRock). Обработка автоматически вычисляет контрольную цифру по коду и показывает на экране образец сформированного штрихкода.

10.04.2006    34399    2898    imsoftware    13