Перекодировка строки в UTF8

1. 7fortune 06.08.12 12:47 Сейчас в теме
Имеется строка - как ее перекодировать в UTF8 ?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. kilokilo 18 06.08.12 13:20 Сейчас в теме
(1) С конца начните - а для чего? Задача - более широко - как стоит?
23. gml 16.08.23 20:12 Сейчас в теме
(1)Строка имеется в 1С?
В 1С внутреннее представление символов - 16-битный Unicode.
Изменение представления (перекодировка) требуется при передаче данных в файл, http-запрос или в двоичные данные.


А перекодированная строка Вам где нужна - в файле, в http-запросе (в заголовке или в теле) или в двоичных данных?

С файлом всё просто - указываете нужную кодировку в параметрах конструктора ЗаписьТекста() или в параметрах метода ЗаписьТекста.Открыть()

С http-запросом - тоже просто, при использовании метода УстановитьТелоИзСтроки() тоже можно задать кодировку

Для двоичных данных - указываете нужную кодировку в методе глобального контекста ПолучитьДвоичныеДанныеИзСтроки()

и т.д.
2. Кадош 06.08.12 12:54 Сейчас в теме
Что и куда кодировать?
4. 7fortune 06.08.12 13:26 Сейчас в теме
Пишу обработку - связку 1С и сайта через API. Пользователь в поле ввода в 1С вводит товар,который хочет купить через сайт.После этого формируется GET-запрос к сайту.В этом запросе нужно передать строчку с наименованием товара в кодировке UTF8. Собственно нужно перекодировать строку с наименованием товара,введенную через поле ввода в UTF8.
5. kilokilo 18 06.08.12 13:39 Сейчас в теме
(4) Скажите, правильно я понимаю - что UTF8 кодировка - это та же, что используется в кодировании URL?
Посмотрите тут - http://infostart.ru/public/70330/
А обратная задача - http://infostart.ru/public/101004/
6. kilokilo 18 06.08.12 13:46 Сейчас в теме
(4)

Функция Из16ВЧисло(Знач Значение)

Результат = 0;
Множитель = 1;
Пока Значение <> "" Цикл
Результат = Результат + Множитель * (Найти("0123456789ABCDEF", Прав(Значение,1))-1);
Множитель = Множитель * 16;
Значение = Лев(Значение,СтрДлина(Значение)-1);
КонецЦикла;
Возврат Результат;

КонецФункции

Функция ДекодироватьURL(URL, WindowsFileURI=Истина)

ДлинаСтроки = СтрДлина(URL);
Инд = 1;
Результат = "";
ПолныйКод = 0;
ОсталосьСимволов = 0;

Пока Инд <= ДлинаСтроки Цикл

Код = КодСимвола(URL, Инд);

Если Код = 37 Тогда
// Символ(37) = "%"
Код = Из16ВЧисло(Сред(URL, Инд+1, 2));
Инд = Инд + 2;
ИначеЕсли ОсталосьСимволов = 0 Тогда
Если (Код = 43) и (не WindowsFileURI) Тогда
// Символ(43) = "+"
Код = 32; // Символ(32) = " " (пробел)
КонецЕсли;
Результат = Результат + Символ(Код);
Инд = Инд + 1;
Продолжить;
КонецЕсли;

Если Код <= 127 Тогда
// Код = 0b0ххххххх
Результат = Результат + Символ(Код);
ИначеЕсли Код <= 191 Тогда
// Код = 0b10хххххх
ПолныйКод = (ПолныйКод*64) + (Код%64); // shl(ПолныйКод, 6) + (Код & 0x3F)
ОсталосьСимволов = ОсталосьСимволов - 1;
Если ОсталосьСимволов = 0 Тогда
Результат = Результат + Символ(ПолныйКод);
КонецЕсли;
ИначеЕсли Код <= 223 Тогда
// Код = 0b110ххххх
ПолныйКод = Код % 32; // Код & 0x1F
ОсталосьСимволов = 1;
ИначеЕсли Код <= 239 Тогда
// Код = 0b1110хххх
ПолныйКод = Код % 16; // Код & 0x0F
ОсталосьСимволов = 2;
ИначеЕсли Код <= 247 Тогда
// Код = 0b11110ххх
ПолныйКод = Код % 8; // Код & 0x07
ОсталосьСимволов = 3;
ИначеЕсли Код <= 251 Тогда
// Код = 0b111110хх
ПолныйКод = Код % 4; // Код & 0x03
ОсталосьСимволов = 4;
ИначеЕсли Код <= 253 Тогда
// Код = 0b1111110х
ПолныйКод = Код % 2; // Код & 0x01
ОсталосьСимволов = 5;
КонецЕсли;

Инд = Инд + 1;
КонецЦикла;

Возврат Результат;
КонецФункции

Примеры:

URL = ДекодироватьURL("http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80");
// URL = "http://ru.wikipedia.org/wiki/Пример"

URL = ДекодироватьURL("c:\documents%20and%20settings\");
// URL = "c:\documents and settings\"
Показать
7fortune; +1 Ответить
7. 7fortune 06.08.12 14:04 Сейчас в теме
Нужно строчку не в URL. В справке нашел КодировкаТекста.UTF8 (TextEncoding.UTF8) не пойму никак - как работать с этим
8. mymyka 06.08.12 14:20 Сейчас в теме
Функция UTF8(Ст)
    НоваяСт = "";
    Для i=1 по СтрДлина(Ст) Цикл
        Символ = Сред(Ст,i,1);
        КодСимвола = КодСимв(Символ);
        Если (КодСимвола > 191) и (КодСимвола < 224) Тогда // А - Я
 
            НоваяСт = НоваяСт + Симв(208)+Симв(КодСимвола-48);
        ИначеЕсли (КодСимвола > 223) и (КодСимвола < 240) Тогда // а - п
 
            НоваяСт = НоваяСт + Симв(208)+Симв(КодСимвола-48);
        ИначеЕсли (КодСимвола > 239) и (КодСимвола < 256) Тогда // р - я
 
            НоваяСт = НоваяСт + Симв(209)+Симв(КодСимвола-112);
        ИначеЕсли (Символ = "ё") или (Символ = "Ё") Тогда
            НоваяСт = НоваяСт + Симв(208)+Симв(КодСимвола-39);
        ИначеЕсли (Символ = "№") Тогда
            НоваяСт = НоваяСт + Симв(226)+Симв(132)+Симв(150);
        Иначе
            НоваяСт = НоваяСт + Символ;
        КонецЕсли;
    КонецЦикла;
    Возврат НоваяСт;
КонецФункции
Показать


вот же, первая же позиция в выдаче гугля
7fortune; +1 Ответить
9. 7fortune 06.08.12 14:46 Сейчас в теме
(8) эта функция для 7.7,в 8 она не правильно будет работать. Вот готовый пример:
 Текст = Новый ЗаписьТекста("d:\utf.txt", КодировкаТекста.UTF8);
    Текст.ЗаписатьСтроку("Добро пожаловать!");
    Текст.ЗаписатьСтроку("Посторонним вход воспрещен.");
    Текст.Закрыть();


потом из файла текст забираем и файл удаляем
12. Windsor77 14 31.01.13 11:53 Сейчас в теме
(8) mymyka, этот алгоритм только для русского алфавита. Мой вариант также быстр, но при этом универсален.
10. mymyka 06.08.12 15:14 Сейчас в теме
доработать до 8 не проблема, а вот доступ на D:\ на сервере у тебя вряд ли будет )
11. alenakrr 06.08.12 18:16 Сейчас в теме
Точно-точно - надо временный файл получать вместо прямого указания на d:
13. devel0per 1 03.02.13 10:57 Сейчас в теме
&НаКлиенте
// Возвращает перекодированную строку из DOS в UTF8
// Аналогично и с дргими кодировками
Функция функDOS2UTF8(СтрокаDOS)
	ТекстUTF8 = Новый ТекстовыйДокумент;		
// ТекстUTF8.УстановитьТипФайла(КодировкаТекста.UTF8); - вот это лишнее, т.к. по умолчанию у насUTF8	
	ТекстUTF8.УстановитьТекст(СтрокаDOS);
	Возврат ТекстUTF8.ПолучитьТекст();
КонецФункции // функDOS2UTF8
Показать
gybson; endym; Somebody1; +3 Ответить
14. Xershi 1493 30.05.19 18:19 Сейчас в теме
(13) еще лучше, т.к. можно управлять параметром кодировки, именно это нам и надо было:
// Возвращает перекодированную строку
Функция ПерекодироватьСтроку(СтрокаКодирования, Кодировка = "windows-1251") экспорт
    
    ТекстДляПерекодирования = Новый ТекстовыйДокумент;        
    ТекстДляПерекодирования.УстановитьТипФайла(Кодировка);
    ТекстДляПерекодирования.УстановитьТекст(СтрокаКодирования);
    
    Возврат ТекстДляПерекодирования.ПолучитьТекст();

КонецФункции // ПерекодироватьСтроку
Показать
Somebody1; reneclub8; Clara; andr_andrey; Rasmur; +5 Ответить
15. TVA_11 06.09.22 11:27 Сейчас в теме
(14)
// Возвращает перекодированную строку
Функция ПерекодироватьСтроку(СтрокаКодирования, Кодировка = "windows-1251") экспорт

ТекстДляПерекодирования = Новый ТекстовыйДокумент;
ТекстДляПерекодирования.УстановитьТипФайла(Кодировка);
ТекстДляПерекодирования.УстановитьТекст(СтрокаКодирования);

Возврат ТекстДляПерекодирования.ПолучитьТекст();

КонецФункции // ПерекодироватьСтроку



Xershi, так ведь обычно нужно перекодировать из одного шрифта в другой. Например:

IBM866 ==> utf-8
17. TVA_11 06.09.22 12:21 Сейчас в теме
(14)

Исходный:
IBM866
тДЦ ╨в557-8-3_5465 ╨╛╤В 02_09_2022 ╨Я╨╡╤А╨╡╨┐╨╕ ..

==>

utf-8
№ Т557-8-3_5465 от 02_09_2022 Перепи ..



Вот так декодирует (успешно) в онлайн декодере. А в 1С не получается.
18. Grivba 15 24.10.22 18:01 Сейчас в теме
// Возвращает перекодированную строку
Функция ПерекодироватьСтроку(СтрокаКодирования, Кодировка = "windows-1251", ПерекодироватьВ = "UTF8") экспорт
	
	времФайл = ПолучитьИмяВременногоФайла("txt");
	
    ТекстДляПерекодирования = Новый ТекстовыйДокумент;        
    ТекстДляПерекодирования.УстановитьТипФайла(Кодировка);
    ТекстДляПерекодирования.УстановитьТекст(СтрокаКодирования);
	
	ТекстДляПерекодирования.Записать(времФайл, Кодировка);
	
	ТекстДляПерекодирования = Новый ТекстовыйДокумент;        
	ТекстДляПерекодирования.Прочитать(времФайл, ПерекодироватьВ);
	
	текст = ТекстДляПерекодирования.ПолучитьТекст();
	
	УдалитьФайлы(времФайл);
	
	Возврат текст;

КонецФункции // ПерекодироватьСтроку
Показать
20. Xershi 1493 16.08.23 14:53 Сейчас в теме
(18) похоже это будет работать, но хотелось без записи файла.
21. user1880116 16.08.23 16:54 Сейчас в теме
(20)
но хотелось без записи файла
Открой уже для себя после 1384 звездочек в 2023 году потоки и прочие буферы двоичных данных.
22. Xershi 1493 16.08.23 17:09 Сейчас в теме
(21) да, это есть, но я не помню с какой версии платформы это появилось. И сам не писал. Правда потоки где-то использовал.
24. user1880116 16.08.23 21:28 Сейчас в теме
(22)
И сам не писал
А планируешь? =)
26. Xershi 1493 18.08.23 17:24 Сейчас в теме
(24) будет задача напишу, сейчас теорией практически не занимаюсь.
19. Xershi 1493 16.08.23 14:49 Сейчас в теме
(14) На 8.3.23.1688 не сработало. Пришлось другой алгоритм использовать.
&НаСервереБезКонтекста
Функция ПерекодироватьТекст(КодируемыйТекст, НачальнаяКодировка = "utf-8", КонечнаяКодировка = "windows-1251")
    
    Стрим           = Новый COMОбъект("Adodb.Stream");
    Стрим.Type      = 2;
    Стрим.Mode      = 3;
    Стрим.charset   = НачальнаяКодировка;
    Стрим.Open();
    Стрим.WriteText(КодируемыйТекст);
    Стрим.Position  = 0;
    Стрим.charset   = КонечнаяКодировка;
    ПерекодируемыйТекст = Стрим.ReadText(-1);
    Стрим.Close();
	
	Возврат ПерекодируемыйТекст;
    
КонецФункции
Показать
25. Grivba 15 17.08.23 10:36 Сейчас в теме
Ну, если без записей, верно сказано выше, используй потоки.
Для меня это лучше и стабильней чем использование ComОбъета.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот