gifts2017

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

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

Наименование Файл Версия Размер
- 246
.1232445296 8,00Kb
15.10.14
246
.1232445296 8,00Kb Бесплатно

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Василий Демидов (Душелов) 20.01.09 13:01
За штатное плюс! Хорошая идея.
2. Артур Аюханов (artbear) 20.01.09 13:40
Так проверить-то легко :) -
формируешь длинный текст из всех возможных печатаемых символов Вин-кодировки код > 31 и <256), преобразуешь его в UTF, далее преобразуешь его обратно в Вин, и сравниваешь полученную строку с исходной.
Если есть различия, значит, прога неверна :)
3. NightHawk 22.01.09 07:31
Спасибо автору. Очень даже выручило)
4. Евгений (jk3) 23.01.09 14:25
Поставим плюс, может когда-нибудь пригодится
5. Алексей Петров (coder) 23.01.09 15:17
вот только в начале любого файла в UTF-8 есть такие символы п»ї и если пользоватся этими функциями то он урезает некоторую часть строки.
6. nickVZ (nickVZ) 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_) 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_) 28.01.09 09:01
(6) ИМХО чтобы записать/прочитать небольшой текстик, содержащий заведомо только ASCII+русские буквы, мой способ будет быстрее и надежнее
9. ssp_ (ssp_) 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) 10.02.09 17:29
круто, давно искал как это сделать!
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) 05.12.11 08:15
Вариант от ssp_ мне больше понравился :)
Тем не менее, автору за идею +
16. Андрей Кравчук (АндрейКр) 06.02.12 15:02
Спасибо за обработку! Помогло.
17. Илья Асламов (7fortune) 07.08.12 20:09
а для 8 нет такой обработки?
18. Андрей Смирнов (curdate) 14.11.12 16:11
Пригодилась обработка, спасибо.
(17) Так функции одинаковые. Если и понадобятся исправления - они будут косметическими.
19. Виталий Попов (popov_vitaly) 14.11.13 11:51
Пригодилась обработка, спасибо.
20. Alexey Burtsev (alexeyburtsev) 21.01.14 11:26
21. Виталий Онянов (Tavalik) 20.06.14 10:31
22. Alex (Deryni) 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_) 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
Божественно! Какие глубинные познания в такой редкой области!