Вверх ↑
Этот топик читают: Гость
Ответов: 39
Рейтинг: 0
#1: 2022-01-23 19:59:04 ЛС | профиль | цитата
Есть задача - пользователь в MEMO пишет текст с байтами UTF-8 в формате \\xF0\\x9F\\x98\\x80
А программа конвертирует эти байты в эмодзи и сохраняет в файл!
Как это можно реализовать?
карма: 0

0
Ответов: 8926
Рейтинг: 823
#2: 2022-01-23 22:51:03 ЛС | профиль | цитата
MBO, нарисуйте 256 смайликов одного размера, каждому присвойте номер в BitmapArray и отрисовывайте эти картинки на одной большой картине, которую можно сохранить в виде файла

Редактировалось 1 раз(а), последний 2022-01-23 22:51:34
карма: 19

0
Ответов: 99
Рейтинг: 4
#3: 2022-01-23 23:37:43 ЛС | профиль | цитата
MBO, ХайАсм стандартно поддерживает в основном только ANSI. Попробуй компилятор FPC 2.6.0 и измененный пакет Дельфи от Netspirit, там есть поддержка Юникода.
карма: 0

0
Ответов: 39
Рейтинг: 0
#4: 2022-01-24 10:29:34 ЛС | профиль | цитата
TheRenat писал(а):
MBO, ХайАсм стандартно поддерживает в основном только ANSI. Попробуй компилятор FPC 2.6.0 и измененный пакет Дельфи от Netspirit, там есть поддержка Юникода.

я как раз использую этот компилятор

Леонид писал(а):
MBO, нарисуйте 256 смайликов одного размера, каждому присвойте номер в BitmapArray и отрисовывайте эти картинки на одной большой картине, которую можно сохранить в виде файла

Редактировалось 1 раз(а), последний 2022-01-23 22:51:34

Нужно сохранять именно в текстовый файл сами емодзи (юникодом)
карма: 0

0
Ответов: 207
Рейтинг: 14
#5: 2022-01-24 11:08:02 ЛС | профиль | цитата
MBO писал(а):
Нужно сохранять именно в текстовый файл сами емодзи (юникодом)

Схема для компиляторов FPC-32U или FPC-64U.

Add(MainForm,2953706,140,161)
{
Width=203
Height=161
link(onCreate,3656530:doReplace,[])
}
Add(Memo,3335973,357,175)
{
Left=15
Top=45
Width=150
Height=65
Font=[MS Sans Serif,23,0,0,1]
ScrollBars=3
}
Add(StreamConvertor,2710629,287,175)
{
Mode=3
Charset=5
link(onResult,3335973:doAdd,[])
}
Add(Replace,3656530,217,175)
{
SubStr="\\x"
link(onReplace,2710629:doConvert,[])
link(Str,14507148:Text,[])
}
Add(Edit,14507148,217,119)
{
Left=15
Top=10
Width=150
Text="\\xF0\\x9F\\x98\\x80"
}
карма: 2

0
Ответов: 793
Рейтинг: 168
#6: 2022-01-24 12:21:59 ЛС | профиль | цитата
MBO, Можно пойти совсем другим путём.
Схема будет работать только в Windows10 с компилятором delphi.
Для вставки символа нажмите кнопку - "Insert Emoji"

Add(MainForm,12346820,224,98)
{
Width=277
Height=119
Point(Handle)
Point(onKeyUp)
Point(doSendToBack)
link(onCreate,756613:doExec,[])
}
Add(KeyEvent,9798208,455,238)
{
Code=91
}
Add(KeyEvent,11056287,455,280)
{
Code=186
}
Add(WinExec,756613,280,112)
{
FileName="write"
link(onExec,7670311:doDeferredEvent,[])
}
Add(FindWindow,12533519,392,112)
{
ClassName="WordPadClass"
SkipParam=1
link(onFind,14986915:doFindChild,[])
}
Add(FindWindow,14986915,455,105)
{
ClassName="RichEdit50W"
SkipParam=1
}
Add(SendMessage,16672478,455,196)
{
Point(Message)
link(Handle,14986915:Handle,[])
link(Message,5203142:Value,[])
}
Add(Memory,5203142,476,147)
{
Default=Integer(7)
}
Add(DeferredEvent,7670311,336,112)
{
Delay=500
link(onDeferredEvent,12533519:doFind,[])
}
Add(Hub,5860563,357,231)
{
OutCount=5
link(onEvent1,16016355:doActive,[(382,237)(382,181)])
link(onEvent2,16672478:doSendMessage,[(389,244)(389,202)])
link(onEvent3,9798208:doPressDown,[])
link(onEvent4,11056287:doPress,[(382,258)(382,286)])
link(onEvent5,9798208:doPressUp,[(389,265)(389,258)])
}
Add(WinTools,16016355,392,161)
{
link(Handle,12533519:Handle,[])
}
Add(Button,9680075,308,231)
{
Left=75
Top=25
Width=80
Caption="Insert Emoji"
link(onClick,5860563:doEvent1,[])
}

карма: 16

0
Ответов: 39
Рейтинг: 0
#7: 2022-01-24 14:41:38 ЛС | профиль | цитата
Joiner писал(а):
Схема для компиляторов FPC-32U или FPC-64U.

Это уже ближе, но можно ли как-то это сделать и для других компиляторов (delphi)

Редактировалось 1 раз(а), последний 2022-01-24 14:42:03
карма: 0

0
Ответов: 39
Рейтинг: 0
#8: 2022-01-24 18:17:47 ЛС | профиль | цитата
Вот что я хотел сделать

Add(MainForm,2953706,147,91)
{
Width=706
Height=455
link(onCreate,9263907:doWork1,[])
}
Add(Memo,2242421,273,35)
{
Width=690
Height=416
Align=5
Strings=#5:Текст|38:А потом бац - смайлик \xF0\x9F\xA4\xA2|54:А тут внезапный смай\xF0\x9F\x8C\xB0лик внутри текста!|36:И в конце еще один \xF0\x9F\x97\xBE |
ScrollBars=2
}
Add(WinExec,16296560,280,98)
{
link(FileName,11032463:Var3,[(286,89)])
}
Add(MultiElement,9263907,231,105)
{
link(onEvent1,16296560:doShellExec,[])
link(Data1,11032463:Var2,[])
link(Data2,2242421:Text,[(244,79)(279,79)])
}
BEGIN_SDK
Add(EditMulti,14454916,21,21)
{
EventCount=1
WorkCount=1
DataCount=2
Width=1091
Height=550
link(doWork1,9482907:doEvent1,[(39,27)(39,55)])
}
Add(RE_Search,14400243,210,196)
{
Expression="(\\\\x([0-9a-h]+))+"
ModifierI=0
ModifierR=1
link(onMatch,2010615:doEvent1,[])
link(onNotFound,15773473:doLength,[(254,209)(254,307)(184,307)(184,454)])
link(SourceStr,1775275:Var2,[])
}
Add(Replace,5013379,336,364)
{
SubStr="\\x"
link(onReplace,8708584:doConvert,[])
}
Add(StreamConvertor,8708584,378,364)
{
Mode=1
Charset=5
link(onResult,12788468:doEvent1,[(670,370)(670,223)])
}
Add(FileStream,5101511,819,210)
{
Mode=1
Point(doCopyFromStream)
link(FileName,14454916:Data1,[(825,116)(27,116)])
}
Add(StreamConvertor,14640789,462,231)
{
Mode=7
Charset=5
link(onResult,12788468:doEvent2,[(642,237)(642,230)])
}
Add(Copy,5162973,413,231)
{
link(onCopy,14640789:doConvert,[])
link(Str,14894165:Var2,[])
link(Position,14694065:Var3,[(426,209)])
}
Add(Hub,9482907,56,49)
{
OutCount=5
link(onEvent1,5101511:doOpen,[(444,55)(444,216)])
link(onEvent2,8831324:doClear,[(210,62)(210,160)])
link(onEvent3,14400243:doExec,[(140,69)(140,202)])
link(onEvent4,5101511:doClose,[(444,76)(444,223)])
link(onEvent5,14454916:onEvent1,[(591,83)(591,27)])
}
Add(Hub,2010615,252,196)
{
OutCount=4
link(onEvent1,13631967:doCalc,[(312,202)(312,237)])
link(onEvent2,6379812:doCalc,[(301,209)(301,328)])
link(onEvent3,5013379:doReplace,[(301,216)(301,370)])
link(onEvent4,14400243:doExecNext,[(278,223)(278,216)(198,216)(198,209)])
}
Add(Hub,12788468,791,217)
{
InCount=3
OutCount=1
link(onEvent1,5101511:doCopyFromStream,[(812,223)(812,230)])
}
Add(Memory,8831324,350,147)
{
}
Add(MathParse,6379812,336,322)
{
link(onResult,8831324:doValue,[(380,328)(380,240)(338,240)(338,153)])
link(X1,1178714:Var3,[(342,226)(278,226)(278,240)])
link(X2,14400243:MatchLen,[(349,212)(275,212)(275,240)(230,240)])
}
Add(MathParse,13631967,357,231)
{
MathStr="%1 - %2"
link(onResult,5162973:doCopy,[])
link(X1,1178714:Var1,[(363,219)(214,219)(214,240)])
link(X2,13811017:Var1,[(370,213)(347,213)(347,194)])
}
Add(GetDataEx,1775275,210,175)
{
link(Data,14454916:Data2,[(216,108)(34,108)])
}
Add(GetDataEx,1178714,217,235)
{
link(Data,14400243:MatchPos,[])
}
Add(GetDataEx,13811017,350,189)
{
link(Data,8831324:Value,[])
}
Add(StreamConvertor,11659400,413,448)
{
Mode=7
Charset=5
link(onResult,12788468:doEvent3,[(586,454)(586,237)])
}
Add(Copy,1773992,364,448)
{
link(onCopy,11659400:doConvert,[])
link(Str,14894165:Var1,[(370,194)])
link(Position,4606086:Var2,[])
link(Count,4260793:Result,[(384,436)(349,436)(349,492)(314,492)])
}
Add(MathParse,4260793,308,448)
{
MathStr="%1 - %2 + 1"
link(onResult,1773992:doCopy,[])
link(X1,15773473:Result,[(314,436)(290,436)(290,492)(265,492)])
link(X2,4606086:Var1,[(321,425)])
}
Add(GetDataEx,14894165,413,189)
{
link(Data,1775275:Var3,[(419,180)])
}
Add(GetDataEx,14694065,350,204)
{
link(Data,13811017:Var2,[])
}
Add(Length,15773473,259,448)
{
link(onLength,4260793:doCalc,[])
link(Str,1775275:Var1,[(265,180)])
}
Add(GetDataEx,4606086,371,420)
{
link(Data,14694065:Var1,[(377,311)(347,311)(347,209)])
}
END_SDK
Add(Memory,12974026,231,35)
{
Default=String(Тест.txt)
}
Add(GetDataEx,11032463,231,84)
{
link(Data,12974026:Value,[])
}

Работает на Delphi и на FPC32
(Работает, вроди, как положено, прошу протестировать на других системах)

--- Добавлено в 2022-01-24 18:18:50

Так же спасибо Joiner за наводку

Редактировалось 1 раз(а), последний 2022-01-24 18:18:50
карма: 0

0
Разработчик
Ответов: 26153
Рейтинг: 2127
#9: 2022-01-24 18:36:49 ЛС | профиль | цитата
MBO писал(а):
Работает на Delphi и на FPC32

Откуда, интересно, в компоненте StreamConvertor появилось свойство Charset? Если это сделано Netspirit-ом специально для пакета FPC, то как твой пример могут проверить те, кто его не использует?
карма: 22

0
Ответов: 4630
Рейтинг: 749
#10: 2022-01-24 23:13:54 ЛС | профиль | цитата
Да, во многих компонентах нового пакета добавлено. Например, в StrList/Memo: когда грузишь/сохраняешь из файла - в какой кодировке предполагается файл?
карма: 26

0
10
Сообщение
...
Прикрепленные файлы
(файлы не залиты)