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

11.02.09

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

Демонстрация перекодировки текста в/из UTF-8 штатными средствами 1с 7.7

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?]
-
.1232445296 8,00Kb
528
528 Скачать бесплатно

На полную универсальность не претендует, но с русскими буквами работает нормально.

Добавлена поддержка букв Ёё.

Собственно функции перекодировки:

Функция ПреобразоватьСтрокуВУТФ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);
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    Возврат Итог;
КонецФункции
 

См. также

Универсальные функции Программист Платформа 1С v7.7 Россия Абонемент ($m)

В библиотеку собраны различные функции по работе с документами, журналами, типами данных, строками, датой и временем, таблицами значений, Excel, файлами, XML, JSON, Http-сервисами, SMTP серверами и т.п.

1 стартмани

22.12.2023    1229    14    user706545_kseg1971    0    

4

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

Получение реквизитов контрагентов из 1С:Контрагент для старых конфигураций под 1с 7.7.

25.04.2022    2277    zhenyat    7    

7

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

Функция выводит таблицу значений в табличный документ. (v7.7) Особенно полезно при отладке. Не нужно вносить изменения в код, вызываем функцию как вычисляемое выражение при останове. Если таблица обрабатывается в несколько этапов, можно вывести её после каждого и визуально проследить эволюцию.

30.06.2021    4990    Zoltan_Black    11    

2

Универсальные функции Системный администратор Программист Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Установка принтера по умолчанию в 1С 7.7. Обработка может быть полезна в том случае, когда нужно установить принтер по умолчанию, а доступа к рабочему столу нет (например, терминальный режим без рабочего стола или remoteApp)

1 стартмани

13.02.2019    13829    4    alsen    3    

5

Универсальные функции Программист Платформа 1С v7.7 Конфигурации 1cv7 1С:Комплексная 7.7 Абонемент ($m)

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

1 стартмани

10.12.2018    10627    malovandrey    6    

19
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Душелов 4018 20.01.09 13:01 Сейчас в теме
За штатное плюс! Хорошая идея.
2. artbear 1562 20.01.09 13:40 Сейчас в теме
Так проверить-то легко :) -
формируешь длинный текст из всех возможных печатаемых символов Вин-кодировки код > 31 и <256), преобразуешь его в UTF, далее преобразуешь его обратно в Вин, и сравниваешь полученную строку с исходной.
Если есть различия, значит, прога неверна :)
10. maloi_a 07.02.09 10:40 Сейчас в теме
(2) Это необходимо, но недостаточно.
Для текста из русских букв не хватает преобразования двух символов: Ё и ё.
12. ssp_ 154 11.02.09 09:11 Сейчас в теме
13. maloi_a 14.02.09 09:40 Сейчас в теме
(12) Как ни странно, но есть ещё один "русский" символ - №, который в алфавит не входит, но может набираться на русской раскладке клавиатуры.
25. Dima_ 150 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 65 23.01.09 14:25 Сейчас в теме
Поставим плюс, может когда-нибудь пригодится
5. coder 23.01.09 15:17 Сейчас в теме
вот только в начале любого файла в UTF-8 есть такие символы п»ї и если пользоватся этими функциями то он урезает некоторую часть строки.
7. ssp_ 154 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_ 154 28.01.09 09:01 Сейчас в теме
(6) ИМХО чтобы записать/прочитать небольшой текстик, содержащий заведомо только ASCII+русские буквы, мой способ будет быстрее и надежнее
9. ssp_ 154 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 3 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. Gvenor 130 06.02.12 15:02 Сейчас в теме
Спасибо за обработку! Помогло.
17. 7fortune 07.08.12 20:09 Сейчас в теме
а для 8 нет такой обработки?
18. curdate 52 14.11.12 16:11 Сейчас в теме
Пригодилась обработка, спасибо.
(17) Так функции одинаковые. Если и понадобятся исправления - они будут косметическими.
19. popov_vitaly 14.11.13 11:51 Сейчас в теме
Пригодилась обработка, спасибо.
20. alexeyburtsev 44 21.01.14 11:26 Сейчас в теме
21. Tavalik 3405 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 Сейчас в теме
Благодарю, очень помогли и сэкономили моё время!
29. etmarket 906 19.06.21 17:58 Сейчас в теме
Хвала и почёт автору публикации!
30. Commander 01.07.22 12:51 Сейчас в теме
Символы « и » не обрабатывает. Как пролечить?
31. Commander 01.07.22 13:15 Сейчас в теме
Вроде пофиксил
ИначеЕсли (Код = 171) Тогда //это символ открывающих кавычек
				Итог = Итог + Симв(194)+Симв(171); 
			ИначеЕсли (Код = 187) Тогда //это символ закрывающих кавычек
				Итог = Итог + Симв(194)+Симв(187); 
Оставьте свое сообщение