Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2018, 11:04   #1
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию символы юникода

Здравствуйте.
Мне нужно из символа юникода получить его HEX-код и наоборот: зная HEX-код, получить сам символ.
Объясняю на примере:
Находим в интернете следующие символы, копируем , вставляем в блокнот windows 10 и сохраняем текстовые файлы в формате "юникод" по одному символу на каждый файл. Затем открываем файлы в HEX-редакторе и видим следующее:
♥ = FF FE 65 26 (два байта на символ)
💁 = FF FE 3D D8 81 DC (четыре байта на символ)
🏁 = FF FE 3C D8 C1 DF (четыре байта на символ)

В интернете нашел, что двухбайтный символ можно получить так:
Код:
  t : string;
  t := WideChar($2665);
// получаем ♥
А как получить четырехбайтный символ, кроме как обычным присваиванием t := '🏁' ?
BLACK_RAIN вне форума Ответить с цитированием
Старый 19.04.2018, 11:37   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Использовать UCS4Char
p51x вне форума Ответить с цитированием
Старый 19.04.2018, 13:06   #3
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Использовать UCS4Char
не выходит
Код:
var
  t : UCS4String;
  S : String;
begin
  SetLength(t, 2);
  t[0] := UCS4Char($DFC1D83C);
  t[1] := ucs4char(0);
  s := UCS4StringToWideString(t);
В переменной S квадратик получается.
А если изменить на:
Код:
  t[0] := UCS4Char($2665);
тогда работает. Сердечко получается.
А с четырёхбайтным не работает.
Что не так?

Последний раз редактировалось BLACK_RAIN; 19.04.2018 в 13:21.
BLACK_RAIN вне форума Ответить с цитированием
Старый 19.04.2018, 14:42   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Не так вот это:
Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
вставляем в блокнот windows 10 и сохраняем текстовые файлы в формате "юникод" по одному символу на каждый файл. Затем открываем файлы в HEX-редакторе и видим следующее:
�� = FF FE 3C D8 C1 DF (четыре байта на символ
Юникод в винде утф16. А u+d83c u+dfc1 это как раз пара для �� в утф16.
p51x вне форума Ответить с цитированием
Старый 19.04.2018, 14:48   #5
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Тогда как программно получить четырёхбайтный символ в string?
BLACK_RAIN вне форума Ответить с цитированием
Старый 19.04.2018, 15:30   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

1. Взять правильный код и использовать UCS4Char
2. Взять один из примеров в офф документации по переконвертации анси, утф8, утф16, ... в утф32
p51x вне форума Ответить с цитированием
Старый 19.04.2018, 15:43   #7
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
2. Взять один из примеров в офф документации по переконвертации анси, утф8, утф16, ... в утф32
То есть, string в delphi это UTF-16? А символы такие как флаг это не UTF-16? А что именно? как это узнать?

Цитата:
Сообщение от p51x Посмотреть сообщение
1. Взять правильный код и использовать UCS4Char
Я не знаю правильный код и как правильно использовать UCS4Char. Думал, может вы подскажете.

Последний раз редактировалось BLACK_RAIN; 19.04.2018 в 15:54.
BLACK_RAIN вне форума Ответить с цитированием
Старый 19.04.2018, 16:00   #8
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Символа Unicode с номером $DFC1D83C не существует максимальный $10FFFF.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 19.04.2018, 16:07   #9
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Символа Unicode с номером $DFC1D83C не существует максимальный $10FFFF.
Тогда объясните, как из последовательности байт FF FE 3C D8 C1 DF получается символ с изображением флага формулы-1
BLACK_RAIN вне форума Ответить с цитированием
Старый 19.04.2018, 16:14   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
$D83CDFC1
суррогатная пара в utf-16
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод из Юникода в мультибайтную строку. (Проблема) Patangaly Общие вопросы C/C++ 3 17.04.2018 20:04
Билдер для юникода Winexcel Общие вопросы Delphi 7 26.07.2014 02:37
символы юникода в макросе caute Microsoft Office Word 3 16.04.2012 17:59
Конвертация строки CString из Юникода в ANSI Moorindal15 Помощь студентам 0 26.04.2011 18:06
Что-то на счёт типов и юникода Smusmumriken Общие вопросы C/C++ 7 10.06.2010 10:47