1С и Unicode

05.09.22

Разработка - Механизмы платформы 1С

Разбираемся, как 1С работает с текстом и отдельными символами в контексте Unicode.

Символы в 1С

Типа "Символ" в 1С нет, с символами мы можем работать только в составе строки, либо как с числовым кодом таблицы Unicode.

Доступные функции работы с символами:

Символ(КодСимвола) - возвращает символ (строку) по кодовой позиции Unicode.
КодСимвола(Строка, НомерСимвола) - возвращает код символа Unicode в строке .

Простой пример:

КодСимвола = КодСимвола("Б"); // Результат: 1041
Символ = Символ(1041); // Результат: Б
Длина = СтрДлина(Символ); // Результат: 1

Код символа, который мы получили является кодовой позицией в таблице символов Unicode.

Unicode - это набор графических символов, в котором каждому символу соответствует числовой код (кодовая позиция или кодовая точка). Кодировка - это способ кодирования этого числового кода (например, UTF-16).

Каждой значимой позиции Unicode соответствует какой-то символ. Не для всех кодовых позиций определен какой-то символ, бОльшая часть позиций "пустая".

Следует различать графический символ и символ как единица текста в 1С. Графический символ - это, то что мы видим на экране монитора. Не для каждого графического символа есть кодовая позиция в таблице Unicode, некоторые графические символы могут получаться как комбинация нескольких кодовых позиций. И эти кодовые позиции будут отдельными символами (здесь речь про единицу текста) в переменной типа "Текст" или в базе данных, хотя в "пользовательском" режиме видеть мы будем только один графический символ.

Мы можем взять любой символ из таблицы Unicode и добавить его в свою строку. Например, символ изображающий инопланетянина: 👽. Кодовая позиция, соответствующая данному символу - 1F47D. В 1С мы не пользуемся шестнадцатеричным представлением, поэтому преобразуем в десятичную: 128125. Попробуем получить символ в 1С по кодовой позиции:

Символ = Символ(128125); // Результат: <пустая строка>
Длина = СтрДлина(Символ); // Результат: 0

Не совсем тот результат, который ожидали. Дело в том, что для хранения представления кодовой позиции Unicode требуется до 4 байтов, а для работы с текстом в 1С используется кодировка UTF-16. В этой кодировке для хранения одной кодовой позиции используется либо 2, либо 4 байта.

Если хранить абсолютно любой символ как 4 байта, это достаточно затратно с точки зрения использования памяти, т.к. большинство используемых символов умещаются в базовую многоязыковую плоскость (первые 65535 символов), для которой достаточно всего 2-х байтов. И UTF-16 как раз использует для хранения частоиспользуемых символов 2 байта (кодовая единица), а если кодовое представление не умещается, то использует уже 4 байта (2 кодовых единицы). И чтобы показать, что это 4 связанных байта, а не две отдельные кодовые единицы, используют суррогатные пары. Суррогатные они потому, что их вычисляют на основании исходной кодовой позиции. Т.е. для этих пар нет соответствия в кодовой таблице.

В стандарте для этого выделили целый диапазон значений, который используется для обозначения подобных символов. Это служебные диапазоны и им не соответствуют никакие значимые символы. Диапазоны:

  • 0xD800 до 0xDBFF (от 55296 до 56319) - для первой кодовой единицы (верхняя часть пары)
  • 0xDC00 до 0xDFFF (от 56320 до 57343) для второй кодовой единицы (нижняя часть пары).

Если попробуем получить символ из этих диапазонов, то получим неопределенный символ, который для разных шрифтов может отображаться по-разному (пробел, знак вопроса, пустой квадратик). Этот символ будет иметь длину.

Символ = Символ(56323); // Результат: <пустой символ>;
Длина = СтрДлина(56323); // Результат: 1

Кодовая позиция нашего инопланетянина (128125) больше границы базового диапазона в 2 байта (65535) и для него нам надо вычислить суррогатную пару.

Функции получения значений суррогатной пары и обратного получения кодовой позиции:

Пара = ПолучитьСуррогатнуюПару(128125); // Результат: ВерхняяПара = 55357, НихняяПара = 56445
Позиция = ПолучитьКодовуюПозицию(Пара.ВерхняяПара, Пара.НихняяПара); // Результат: 128125

Функция ПолучитьСуррогатнуюПару(КодоваяПозиция)
	
	Результат = Новый Структура("ВерхняяПара, НихняяПара");
	
	Результат.ВерхняяПара = ПобитовыйСдвигВправо(КодоваяПозиция, 10) + (55296 - (ПобитовыйСдвигВправо(65536, 10)));
	Результат.НихняяПара = ПобитовоеИ(КодоваяПозиция, 1023) + 56320;
	
	Возврат Результат;
	
КонецФункции

функция ПолучитьКодовуюПозицию(ВерхняяЧасть, НихняяЧасть)
	
	Возврат (ПобитовыйСдвигВлево(ВерхняяПара, 10) + НихняяПара) + (65536 - (ПобитовыйСдвигВлево(55296, 10)) - 56320);
	
КонецФункции

Происходит преобразование двух 16-разрядных значений в одно 21-разрядное. Программа (в нашем случае 1С), обрабатывающая такие символы, понимает, что код символа попадает в верхний или нихний диапазон суррогатного значения, и обрабатывает такой символ особым образом.

Для нашего символа с кодовой позицией 128125 пара будет такой: 55357 (верхняя часть) и 56445 (нижняя часть). Если будем использовать, например, для записи в JSON, то "\ud83d" и "\udc7d" (преобразовали в HEX и добавили "\u" вначале).

Все что нам остается, это получить оба символа и объединить в одну строку:

Символ = Символ(55357) + Символ(56445); // Результат: 👽
Длина = СтрДлина(Символ); // Результат: 2
Сообщить(Символ);

Вывод в режиме предприятия:

Обратите внимание, что строка имеет длину равную 2, но отображаются эти два символа как один. 

 

Также следует обратить внимание, что бывают символы, которые состоят из двух кодовых точек, но при этом они не являются суррогатной парой. Например символ "й", который можно получить двумя способами:

  • введя привычный нам кириллический символ "й"
  • используя два символа - киррилическое "и" (1080) и "верхняя дуга" (774) (комбинируемый диакритический знак).

Символ "верхняя дуга" не смог вставить в текст, т.к. редактор инфостарта некоторые Unicode символы меняет на что-то непонятное. Так что получите их самостоятельно.

Символ = Символ(1080) + Символ (774); // Результат: й;
Длина = СтрДлина(Символ); // Результат: 2
Сообщить(Символ = "й"); // Результат: Ложь, т.к. строки различаются

Внешне выглядят эти два графических символа одинаково, но состав символов в строке разный.

В базе данных подобные значения прекрасно хранятся и обрабатываются. А редактирование строк с такими символами в пользовательском режиме ничем не отличается от обычных.

 

Работа со строками в 1С

Т.к. для 1С суррогатная пара и составной символ это два разных символа, то и работает она с ними по-отдельности.


СуррогатнаяПара = Символ(55357) + Символ(56445); // Результат: 👽
СоставнойСимвол = Символ(1080) + Символ (774); // Результат: й

ПервыйСимвол1 = Лев(СуррогатнаяПара, 1); // Результат: <пустой символ> (55357)
ПервыйСимвол2 = Лев(СоставнойСимвол, 1); // Результат: и (1080)

Строка = "Зелены" + СоставнойСимвол + " " + СуррогатнаяПара + " человечек"; // Результат: Зеленый 👽 человечек

// Поиск отрабатывает с учетом длины составного символа (2)
Позиция = СтрНайти(Строка, СуррогатнаяПара); // Результат: 10

// Каждый символ будет считаться разделителем, поэтому появляется лишняя пустая строка
МассивСтрок = СтрРазделить(Строка, СуррогатнаяПара); // Результат: 3 элемента

// Для обычной "и" прописаны правила преобразования в верхний регистр, поэтому все проходит хорошо
// Символ с инопланетяниным остается неизменным
СтрокаВРег = ВРег(Строка); // Результат: ЗЕЛЕНЫЙ 👽 ЧЕЛОВЕЧЕК
КодСимвола = КодСимвола(СтрокаВРег, 7); // Результат: 1048

Как и ожидалось - каждый символ учитывается отдельно. Отличий в поведении для составных символов или суррогатных пар нет.

Для СтрРазделить оба символа уже будут разделителями, поэтому надо быть с этим осторожным. В остальном каких либо различий нет. В запросах поведение схожее.

См. также

Сервисы интеграции без Шины и интеграции

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    2568    dsdred    16    

59

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    5928    dsdred    55    

83

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    5878    YA_418728146    25    

68

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6981    dsdred    36    

113

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    19077    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12786    human_new    27    

76

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    9410    YA_418728146    6    

143

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6530    sebekerga    54    

95
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. dmpas 418 05.09.22 09:55 Сейчас в теме
Сообщить(Символ = "й"); // Результат: Ложь, т.к. строки различаются


к слову, СравнениеЗначений показывает, что строки равны.
mrsmrv; Irwin; +2 Ответить
2. Irwin 550 05.09.22 10:08 Сейчас в теме
(1) Видимо, использует нормализацию
3. frkbvfnjh 787 05.09.22 10:39 Сейчас в теме
Спасибо, полезная статья! Думаю должна помочь с рассылкой символов-картинок в телеграмм.
16. uno-c 235 08.09.22 09:07 Сейчас в теме
(3) Если в телегу отправить Символ = Символ(55357) + Символ(56445)? то в телегу придут два вопроса. Телега не с UTF-16, а с UTF-8 работает. Но 1С не умеет с UTF-8 выше 65535 работать.

PS Кстати, моя обработка отправила человечка в телегу, см. картинку )
Прикрепленные файлы:
18. Irwin 550 08.09.22 12:28 Сейчас в теме
(16) Если нужна функция перевода текста в UTF-8:

Функция EncodeUTF8(Текст)
	
	Позиция = 1;
	Длина = СтрДлина(Текст);
	Результат = Новый Массив;

	Пока Позиция <= Длина Цикл
		
		Смещение = Ложь;
		КодСимвола = КодСимвола(Текст, Позиция);
		Позиция = Позиция + 1;
		
		Если КодСимвола < 128 Тогда
			
			Результат.Добавить(КодСимвола);
			
		ИначеЕсли КодСимвола < 2048 Тогда
			
			Результат.Добавить(ПобитовоеИли(192, ПобитовыйСдвигВправо(КодСимвола, 6)));
			Результат.Добавить(ПобитовоеИли(128, ПобитовоеИ(КодСимвола, 63)));
			
		ИначеЕсли КодСимвола >= 55296 И КодСимвола <= 57343 Тогда
			
			КодоваяПозиция = -1;
			КодСимвола2 = 0;
			
			Если КодСимвола >= 55296 И КодСимвола < 56320 И Позиция < Длина Тогда
				КодСимвола2 = КодСимвола(Текст, Позиция);
				Если КодСимвола2 >= 56320 И КодСимвола2 < 57344 Тогда
					КодоваяПозиция = (ПобитовыйСдвигВлево(КодСимвола, 10) + КодСимвола2) + (65536 - (ПобитовыйСдвигВлево(55296, 10)) - 56320);
				КонецЕсли;
			КонецЕсли;
			
			Если КодоваяПозиция < 0 Тогда
				ВызватьИсключение "Неизвестный символ";
			Иначе
				Результат.Добавить(ПобитовоеИли(240, ПобитовыйСдвигВправо(КодоваяПозиция, 18)));
				Результат.Добавить(ПобитовоеИли(128, ПобитовоеИ(ПобитовыйСдвигВправо(КодоваяПозиция, 12), 63)));
				Результат.Добавить(ПобитовоеИли(128, ПобитовоеИ(ПобитовыйСдвигВправо(КодоваяПозиция, 6), 63)));
				Результат.Добавить(ПобитовоеИли(128, ПобитовоеИ(КодоваяПозиция, 63)));
				Позиция = Позиция + 1;
			КонецЕсли;
			
		Иначе
			Результат.Добавить(ПобитовоеИли(224, ПобитовыйСдвигВправо(КодСимвола, 12)));
			Результат.Добавить(ПобитовоеИли(128, ПобитовоеИ(ПобитовыйСдвигВправо(КодСимвола, 6), 63)));
			Результат.Добавить(ПобитовоеИли(128, ПобитовоеИ(КодСимвола, 63)));
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат Результат;

КонецФункции
Показать
19. uno-c 235 08.09.22 14:30 Сейчас в теме
(18) И как зеленого человечка этой функцией перевести в UTF-8 ?
20. Irwin 550 08.09.22 14:41 Сейчас в теме
(19) Передаете текст, где присутствует зеленый человечек. На выходе получаем массив байтов. Дальше с этим массивом можно делать что угодно.
22. uno-c 235 08.09.22 14:48 Сейчас в теме
(20) Как его передать? В форму в поле ввода он не копипастится, в коде его не сделаешь путем Символ(128125).
24. uno-c 235 08.09.22 15:12 Сейчас в теме
(20) Пока получилось только через ЧтениеТекста передать, предварительно записав зеленого человечка в файл. Но должен сказать, что есть более простое решение для Вашей Функция EncodeUTF8(Текст).

Функция МассивБайтовУТФ8(Текст)
	Буфер = ПолучитьБуферДвоичныхДанныхИзСтроки(Текст);
	МассивБайтов = Новый Массив;
	Для Каждого Число из Буфер Цикл
		МассивБайтов.Добавить(Число);
	КонецЦикла;
	Возврат МассивБайтов;
КонецФункции
26. uno-c 235 08.09.22 19:50 Сейчас в теме
(20) А, так я просто напоролся на ошибку в Вашей функции и поэтому решил, что человечка туда так просто не передать. Проверьте, например
 Процедура ВылетитВОшибку(Команда)
	 Символ = Символ(55357) + Символ(56445);
	 ЭтаСтрокаПерекодируетсяВМассивУТФ8 = Символ + "1";
	 ЭтаСтрокаВылетитВОшибку = "1" + Символ;
	 МассивБайтовУТФ = EncodeUTF8(Символ); //выдаст "Неизвестный символ"
	 МассивБайтовУТФ = EncodeUTF8(ЭтаСтрокаВылетитВОшибку); //выдаст "Неизвестный символ"
	 МассивБайтовУТФ = EncodeUTF8(ЭтаСтрокаПерекодируетсяВМассивУТФ8);
 КонецПроцедуры


Но это даже к лучшему, пока искал как - нашел такую фишку для Телеграма и для Вашей статьи: как обойтись без вычисления суррогатных пар
 Процедура СимволЗеленыйЧеловечек(Команда)
	Буфер = Новый БуферДвоичныхДанных(4);
	Буфер.ЗаписатьЦелое32(0, 128125);
	СимволЗеленыйЧеловечек = ПолучитьСтрокуИзБуфераДвоичныхДанных(Буфер, "UTF-32LE");
	Сообщить(СимволЗеленыйЧеловечек);
 КонецПроцедуры
27. uno-c 235 08.09.22 20:26 Сейчас в теме
(26) И в обратку, не знаю где такое нужно, но тоже без получения суррогатных пар:
Сообщить("Позиция человечка в Юникоде: " + ПолучитьБуферДвоичныхДанныхИзСтроки(СимволЗеленыйЧеловечек, "UTF-32LE").ПрочитатьЦелое32(0)); 
//Позиция человечка в Юникоде: 128 125
MaxxiMiliSan; Irwin; +2 Ответить
21. frkbvfnjh 787 08.09.22 14:46 Сейчас в теме
(16) Не скромный вопрос - где взять Вашу обработку?
23. uno-c 235 08.09.22 14:50 Сейчас в теме
(21) В профиле. Но она писалась еще для 8.3.10, с побитовыми сдвигами как автор предлагает - более изящно получится )
25. uno-c 235 08.09.22 16:33 Сейчас в теме
(21) А так даже изящнее, чем у автора, только что придумал )
Процедура УТФ32(Команда)
	Буфер = Новый БуферДвоичныхДанных(4);
	Буфер.ЗаписатьЦелое32(0, 128125, ПорядокБайтов.BigEndian); //128125 - зеленый человечек
	СимволЧеловечек = ПолучитьСтрокуИзБуфераДвоичныхДанных(Буфер, "UTF-32BE");
	TelegramMessage = Новый Структура("chat_id, text", 123456789, "Зелененький он был: " + СимволЧеловечек);
	Жсон = Новый ЗаписьJSON;
	Жсон.УстановитьСтроку(Новый ПараметрыЗаписиJSON(,,,ЭкранированиеСимволовJSON.СимволыВнеBMP));
	ЗаписатьJSON(Жсон, TelegramMessage);
	ТелоЗапросаPOST = Жсон.Закрыть();
	Сообщить(ТелоЗапросаPOST);
	ХТТПСоединение = Новый HTTPСоединение("api.telegram.org",,,,,,Новый ЗащищенноеСоединениеOpenSSL,Ложь);
	ХТТПЗапрос = Новый HTTPЗапрос("bot123456789:AAE*-KLAA/sendMessage");
	ХТТПЗапрос.Заголовки.Вставить("Content-Type", "application/json");
	ХТТПЗапрос.УстановитьТелоИзСтроки(ТелоЗапросаPOST);
	ХТТПОтвет = ХТТПСоединение.ОтправитьДляОбработки(ХТТПЗапрос);
КонецПроцедуры
Показать


Сообщения: (1С)
{
"chat_id": 123456789,
"text": "Зелененький он был: \uD83D\uDC7D"
}


Обратите внимание, само собой сделалось то, о чем говорил автор про зеленого человечка (цитата автора):
Для нашего символа с кодовой позицией 128125 пара будет такой: 55357 (верхняя часть) и 56445 (нижняя часть). Если будем использовать, например, для записи в JSON, то "\ud83d" и "\udc7d" (преобразовали в HEX и добавили "\u" вначале).


Результат по телеграмму в картинке:
Прикрепленные файлы:
suepifanov; Aleskey_K; kser87; +3 1 Ответить
17. uno-c 235 08.09.22 11:39 Сейчас в теме
(3) Хотя нет, смотрю я тоже какие-то суррогатные пары вычислял, давно это было ...
У меня для зеленого человечка получился GET https://api.telegram.org/bot123456789:AA***-KLAA/sendMessage?chat_id=123456789&text=%F0%9F%91%BD

Т.е. текст в кодировке UTF-8 (зеленый человечек = F0 9F 91 BD)

Но нормально ушло в POST то, что автор статьи предлагал в UTF-16 ( \ud83d\udc7d ), см. картинку.

POST /bot123456789:AA***-KLAA/sendMessage HTTP/1.1
Host: api.telegram.org
Content-Type: application/json
Content-Length: 79

{
"chat_id": "123456789",
"text": "POST from Postman \ud83d\udc7d"
}
Прикрепленные файлы:
4. kser87 2441 05.09.22 11:33 Сейчас в теме
Очень интересно, но ничего не понятно. Как-то переход к сурргатным парам туманно описан.

ПобитовыйСдвигВлево
ПобитовыйСдвигВправо
ПобитовоеИ

хотелось бы готовый код и этих функций, если можно
5. Irwin 550 05.09.22 11:49 Сейчас в теме
(4) Это встроенные функции платформы. Добавили в 8.3.11
Hobbit_Jedi; frkbvfnjh; kser87; +3 Ответить
7. Jimbo 9 05.09.22 13:40 Сейчас в теме
Сообщить("Турецкая лира "+Символ(8378));
Сообщить("Русский рубль "+Символ(8381));

Что- то 1с как будто турки писали:
Прикрепленные файлы:
AllexSoft; +1 Ответить
8. Asmody 05.09.22 15:56 Сейчас в теме
(7) Зависит от шрифта:
12. Jimbo 9 06.09.22 07:42 Сейчас в теме
(8)все шрифты по умолчанию, Windows 10 и серверы 2012 r2 и 2019 выдают именно так. Платформа 21я. В ворд копи паст из окна сообщений 1с- дают норм
13. frkbvfnjh 787 06.09.22 14:37 Сейчас в теме
(8) А что за шрифт во вкладке "Встроенный редактор"?
9. Sashares 34 05.09.22 16:00 Сейчас в теме
Спасибо, интересно.
П.С. Опечатка на скрине.
Прикрепленные файлы:
10. Irwin 550 06.09.22 05:15 Сейчас в теме
11. quazare 3606 06.09.22 07:12 Сейчас в теме
интересный материал, спасибо!
mitia.mackarevich; Irwin; +2 Ответить
14. Asmody 06.09.22 17:54 Сейчас в теме
15. frkbvfnjh 787 07.09.22 04:45 Сейчас в теме
(14) Благодарствую! Никогда о таком не слышал, смотрится знатно =)
28. uno-c 235 09.09.22 18:07 Сейчас в теме
Unicode - это набор графических символов

Правильнее сказать, что Unicode - это стандарт кодирования, который включает в себя как пронумерованный набор символов, так и семь кодировок (UTF-8 и др.), т.е. семь схем как закодировать номера этих символов в двоичные данные.

В остальном каких либо различий нет

Обнаружено, что следующий код выдаст неверный результат:
КодироватьСтроку(Символ(55357) + Символ(56445), СпособКодированияСтроки.КодировкаURL);

Должно получиться %F0%9F%91%BD, а выдает не то.
Т.е. не умеет 1С суррогатно-полученные символы, наподобие U+1F47D инопланетянина, правильно УРЛ-кодировать.
29. uno-c 235 09.09.22 22:00 Сейчас в теме
а для работы с текстом в 1С используется кодировка UTF-16. В этой кодировке для хранения одной кодовой позиции используется либо 2, либо 4 байта.

Для работы с текстом в 1С в основном используется кодировка UTF-8. Одно- и двухбайтовые символы, т.е. подавляющий объем текста, 1С кодирует UTF8. А вот с 4-байтовыми эска переходит на UTF-16, и, судя по экранированию, это для нее не родное, наверное поэтому не может сделать УРЛ-кодирование 4-байтовых символов.

	Структура = Новый Структура("РоднаяКодировкаСтрок1С", Новый ХранилищеЗначения("ДДД"));
	Сообщить(ЗначениеВСтрокуВнутр(Структура));
	//{"#",4238019d-7e49-4fc9-91db-b6b951d5cf8e,
	//{1,
	//{
	//{"S","РоднаяКодировкаСтрок1С"},
	//{"#",e199ca70-93cf-46ce-a54b-6edc88c3a296,
	//{#base64:AQERAAAAAAAAAO+7v3siUyIsItCU0JTQlCJ9}
	//}
	//}
	//}
	//}	
	Двоичные = Base64Значение("AQERAAAAAAAAAO+7v3siUyIsItCU0JTQlCJ9");
	//Двоичные	01 01 11 00 00 00 00 00 00 00 EF BB BF 7B 22 53 22 2C 22 D0 94 D0 94 D0 94 22 7D	ДвоичныеДанные
	//                                          UTF8mark {  "  S  "  ,  "    Д     Д     Д    "  }
	УТФ8 = ПолучитьСтрокуИзДвоичныхДанных(Двоичные, КодировкаТекста.UTF8);
	// {"S","ДДД"}
	УТФ16 = ПолучитьСтрокуИзДвоичныхДанных(Двоичные, КодировкаТекста.UTF16);
	//  ā   믯箿匢Ⱒ퀢킔킔⊔�

	// D094 - это  UTF-8 "Д Кириллическая заглавная буква дэ U+0414". В UTF-16 она кодируется как 0414	
	
	Структура = Новый Структура("Инопланетянин", Новый ХранилищеЗначения(Символ(55357) + Символ(56445)));
	Сообщить(ЗначениеВСтрокуВнутр(Структура));
	//{"#",4238019d-7e49-4fc9-91db-b6b951d5cf8e,
	//{1,
	//{
	//{"S","Инопланетянин"},
	//{"#",e199ca70-93cf-46ce-a54b-6edc88c3a296,
	//{#base64:AQEXAAAAAAAAAO+7v3siUyIsIiJcZDgzZCJcZGM3ZCJ9}
	//}
	//}
	//}
	//}	
	Двоичные = Base64Значение("AQEXAAAAAAAAAO+7v3siUyIsIiJcZDgzZCJcZGM3ZCJ9");
	//Двоичные	01 01 17 00 00 00 00 00 00 00 EF BB BF 7B 22 53 22 2C 22 22 5C 64 38 33 64 22 5C 64 63 37 64 22 7D	ДвоичныеДанные
	//                                          UTF8mark {  "  S  "  ,  "  "  \  d  8  3  d  "  \  d  c  7  d  "  }
	УТФ8 = ПолучитьСтрокуИзДвоичныхДанных(Двоичные, КодировкаТекста.UTF8);
	// {"S",""\d83d"\dc7d"}
Показать
Aleskey_K; +1 1 Ответить
30. uno-c 235 10.09.22 08:59 Сейчас в теме
(29) Но с другой стороны... Написал такую процедуру, сделал точку останова в конце, чтобы в памяти компа переменная осталась.
&НаКлиенте
Процедура ПеременнаяД(Команда)
	ПеременнаяД = "";
	Для Сч = 1 по 100000 Цикл
		ПеременнаяД = ПеременнаяД + "Д";
	КонецЦикла;
КонецПроцедуры


Запустил в отладке, остановилось на точке останова (когда ПеременнаяД полностью заполнена)
В Process Explorer сделал полный дамп процесса 1cv8c.exe, посмотрел этот дамп. Куча подряд идущих букв "Д" в дампе была в кодировке UTF16LE т.е. 1404, а не UTF8 D094.

Интересно, что будет в линуксе.
Прикрепленные файлы:
31. pavlo 08.02.24 10:29 Сейчас в теме
не понял, подскажите а есть что то типа вернуть UTF-8 из кириллицы в такое "\d83d"\dc7d" ?
32. FReIM 8 12.02.24 15:57 Сейчас в теме
Просто оставлю это здесь:
?( "R" > "r", 1, 0) =1, т.е. "R" > "r"
но
?( КодСимвола("R") > КодСимвола("r"), 1, 0) =0, т.е. КодСимвола("R")<КодСимвола("r")
вопрос, как 1С строки сравнивает?
Оставьте свое сообщение