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

Опубликовал ssp_ (ssp_) в раздел Программирование - Универсальные функции

Демонстрация перекодировки текста в/из 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
15.10.14
256
.1232445296 8,00Kb 256 Бесплатно

См. также

Комментарии
1. Василий Демидов (Душелов) 3779 20.01.09 13:01 Сейчас в теме
За штатное плюс! Хорошая идея.
2. Артур Аюханов (artbear) 851 20.01.09 13:40 Сейчас в теме
Так проверить-то легко :) -
формируешь длинный текст из всех возможных печатаемых символов Вин-кодировки код > 31 и <256), преобразуешь его в UTF, далее преобразуешь его обратно в Вин, и сравниваешь полученную строку с исходной.
Если есть различия, значит, прога неверна :)
3. NightHawk 22.01.09 07:31 Сейчас в теме
Спасибо автору. Очень даже выручило)
4. Евгений (jk3) 65 23.01.09 14:25 Сейчас в теме
Поставим плюс, может когда-нибудь пригодится
5. Алексей Петров (coder) 23.01.09 15:17 Сейчас в теме
вот только в начале любого файла в UTF-8 есть такие символы п»ї и если пользоватся этими функциями то он урезает некоторую часть строки.
6. nickVZ (nickVZ) 10 24.01.09 11:56 Сейчас в теме
Для автора. Есть такой вполне даже штатный для виндов объект: ADODB.Stream. И у этого объекта есть параметр Charset, задающий кодировку.
Попробуй.
http://msdn.microsoft.com/en-us/library/ms808793.aspx
One; alexeyburtsev; Whale; +3 Ответить 1
7. ssp_ (ssp_) 127 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
8. ssp_ (ssp_) 127 28.01.09 09:01 Сейчас в теме
(6) ИМХО чтобы записать/прочитать небольшой текстик, содержащий заведомо только ASCII+русские буквы, мой способ будет быстрее и надежнее
9. ssp_ (ssp_) 127 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 Ответить
10. Alexandr (maloi_a) 07.02.09 10:40 Сейчас в теме
(2) Это необходимо, но недостаточно.
Для текста из русских букв не хватает преобразования двух символов: Ё и ё.
11. ArCtic (ArCtic) 1 10.02.09 17:29 Сейчас в теме
круто, давно искал как это сделать!
12. ssp_ (ssp_) 127 11.02.09 09:11 Сейчас в теме
13. Alexandr (maloi_a) 14.02.09 09:40 Сейчас в теме
(12) Как ни странно, но есть ещё один "русский" символ - №, который в алфавит не входит, но может набираться на русской раскладке клавиатуры.
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) 18 05.12.11 08:15 Сейчас в теме
Вариант от ssp_ мне больше понравился :)
Тем не менее, автору за идею +
16. Андрей Кравчук (АндрейКр) 124 06.02.12 15:02 Сейчас в теме
Спасибо за обработку! Помогло.
17. Илья Асламов (7fortune) 07.08.12 20:09 Сейчас в теме
а для 8 нет такой обработки?
18. Андрей Смирнов (curdate) 22 14.11.12 16:11 Сейчас в теме
Пригодилась обработка, спасибо.
(17) Так функции одинаковые. Если и понадобятся исправления - они будут косметическими.
19. Виталий Попов (popov_vitaly) 14.11.13 11:51 Сейчас в теме
Пригодилась обработка, спасибо.
20. Alexey Burtsev (alexeyburtsev) 43 21.01.14 11:26 Сейчас в теме
21. Виталий Онянов (Tavalik) 357 20.06.14 10:31 Сейчас в теме
22. Alex (Deryni) 22 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);
				КонецЕсли;				
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    Возврат Итог;
КонецФункции
...Показать Скрыть
23. Ivan (One) 13.10.15 09:43 Сейчас в теме
Спасибо автору за готовый код - сильно выручил.
24. Helle (Helle) 25.10.15 08:53 Сейчас в теме
25. Дмитрий Фаст (Dima_) 54 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 Тогда Итог=Итог+"№";
					КонецЕсли;
                КонецЕсли;
			КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    Возврат Итог;
КонецФункции
...Показать Скрыть
26. Александр Дятченко (Alexander.Dyatchenko) 27.04.16 17:44 Сейчас в теме
Божественно! Какие глубинные познания в такой редкой области!