0. ssp_ 140 20.01.09 13:01 Сейчас в теме

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

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

Перейти к публикации

Комментарии
Избранное Подписка Сортировка: Древо
1. Душелов 3902 20.01.09 13:01 Сейчас в теме
За штатное плюс! Хорошая идея.
2. artbear 1165 20.01.09 13:40 Сейчас в теме
Так проверить-то легко :) -
формируешь длинный текст из всех возможных печатаемых символов Вин-кодировки код > 31 и <256), преобразуешь его в UTF, далее преобразуешь его обратно в Вин, и сравниваешь полученную строку с исходной.
Если есть различия, значит, прога неверна :)
10. maloi_a 07.02.09 10:40 Сейчас в теме
(2) Это необходимо, но недостаточно.
Для текста из русских букв не хватает преобразования двух символов: Ё и ё.
12. ssp_ 140 11.02.09 09:11 Сейчас в теме
13. maloi_a 14.02.09 09:40 Сейчас в теме
(12) Как ни странно, но есть ещё один "русский" символ - №, который в алфавит не входит, но может набираться на русской раскладке клавиатуры.
25. Dima_ 130 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_ 140 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_ 140 28.01.09 09:01 Сейчас в теме
(6) ИМХО чтобы записать/прочитать небольшой текстик, содержащий заведомо только ASCII+русские буквы, мой способ будет быстрее и надежнее
9. ssp_ 140 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 23 14.11.12 16:11 Сейчас в теме
Пригодилась обработка, спасибо.
(17) Так функции одинаковые. Если и понадобятся исправления - они будут косметическими.
19. popov_vitaly 14.11.13 11:51 Сейчас в теме
Пригодилась обработка, спасибо.
20. alexeyburtsev 43 21.01.14 11:26 Сейчас в теме
21. Tavalik 2126 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 Сейчас в теме
Божественно! Какие глубинные познания в такой редкой области!
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист 1С
Санкт-Петербург
зарплата от 80 000 руб. до 130 000 руб.
Полный день

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству

Программист/Cтарший программист 1С
Москва
зарплата от 100 000 руб. до 250 000 руб.
Полный день

Программист 1С
Калининград
зарплата от 60 000 руб. до 80 000 руб.
Полный день

Руководитель проектов 1С
Санкт-Петербург
Полный день