ANTICHAT

ANTICHAT (https://forum.antichat.io/index.php)
-   Общие вопросы программирования (https://forum.antichat.io/forumdisplay.php?f=206)
-   -   Перевести текст из UTF8 в CP1251 (https://forum.antichat.io/showthread.php?t=1422341)

Vegas 15.02.2022 00:07

Я получаю сообщения из телеграмм чата с ботом, и как бы все хорошо но пока не начну отправлять русские символы ибо они превращаются вот в это "\u041f\u0440\u0438\u0432\u0435\u0442"(Это слово "Привет"). Как мне перевести этот текст как я понял из формата UTF8 в CP1251? Много каких-то функций с разных форумов попробовал но не одна не помогла :P

#kweeZ 15.02.2022 00:15

encoding юзай, примеров полно, можешь тут глянуть https://www.blast.hk/threads/121580/

Vegas 15.02.2022 00:18

Цитата:

Сообщение от #kweeZ

encoding юзай, примеров полно, можешь тут глянуть https://www.blast.hk/threads/121580/

Теперь научите подключать lua библиотеку к C++ плагину

kin4stat 15.02.2022 00:40

Цитата:

Сообщение от vegas~

Я получаю сообщения из телеграмм чата с ботом, и как бы все хорошо но пока не начну отправлять русские символы ибо они превращаются вот в это "\u041f\u0440\u0438\u0432\u0435\u0442"(Это слово "Привет"). Как мне перевести этот текст как я понял из формата UTF8 в CP1251? Много каких-то функций с разных форумов попробовал но не одна не помогла :P

использовать UTF-8 IO, и будет тебе счастье

3lcode 22.02.2022 18:16

Цитата:

Сообщение от vegas~

Как мне перевести этот текст как я понял из формата UTF8 в CP1251?

Техническое Объявление

Vegas 27.02.2022 23:16

Цитата:

Сообщение от kin4stat

использовать UTF-8 IO, и будет тебе счастье

Может кто нибудь объяснить что здесь происходит

C++:





Код:

regex_search
(
response
.
c_str
(
)
,
res
,
regex
(
"\"text\":\"(.+)\""
)
)
;
string message
=
res
[
1
]
;
SF
->
Log
(
"\u041a\u0447\u0430\u0443"
)
;
SF
->
Log
(
message
)
;


Vegas 27.02.2022 23:51

Цитата:

Сообщение от NotReal

можешь мне в вк отписать, попробую помочь

Вк дай свой, у тебя в профиле не нашел

Vegas 05.03.2022 13:55

up

zTechnology 05.03.2022 13:59

Цитата:

Сообщение от vegas~

Я получаю сообщения из телеграмм чата с ботом, и как бы все хорошо но пока не начну отправлять русские символы ибо они превращаются вот в это "\u041f\u0440\u0438\u0432\u0435\u0442"(Это слово "Привет"). Как мне перевести этот текст как я понял из формата UTF8 в CP1251? Много каких-то функций с разных форумов попробовал но не одна не помогла :P

C++:





Код:

std
::
string
UTF8_to_CP1251
(
std
::
string
const
&
utf8
)
{
if
(
!
utf8
.
empty
(
)
)
{
int
wchlen
=
MultiByteToWideChar
(
CP_UTF8
,
0
,
utf8
.
c_str
(
)
,
utf8
.
size
(
)
,
NULL
,
0
)
;
if
(
wchlen
>
0
&&
wchlen
!=
0xFFFD
)
{
std
::
vector

wbuf
(
wchlen
)
;
MultiByteToWideChar
(
CP_UTF8
,
0
,
utf8
.
c_str
(
)
,
utf8
.
size
(
)
,
&
wbuf
[
0
]
,
wchlen
)
;
std
::
vector

buf
(
wchlen
)
;
WideCharToMultiByte
(
1251
,
0
,
&
wbuf
[
0
]
,
wchlen
,
&
buf
[
0
]
,
wchlen
,
0
,
0
)
;
return
std
::
string
(
&
buf
[
0
]
,
wchlen
)
;
}
}
return
std
::
string
(
)
;
}



credits: https://www.cyberforum.ru/cpp-beginners/thread1249547.html

никогда не поздно научиться гуглить

Vegas 05.03.2022 14:07

Цитата:

Сообщение от zTechnology

C++:





Код:

std
::
string
UTF8_to_CP1251
(
std
::
string
const
&
utf8
)
{
if
(
!
utf8
.
empty
(
)
)
{
int
wchlen
=
MultiByteToWideChar
(
CP_UTF8
,
0
,
utf8
.
c_str
(
)
,
utf8
.
size
(
)
,
NULL
,
0
)
;
if
(
wchlen
>
0
&&
wchlen
!=
0xFFFD
)
{
std
::
vector

wbuf
(
wchlen
)
;
MultiByteToWideChar
(
CP_UTF8
,
0
,
utf8
.
c_str
(
)
,
utf8
.
size
(
)
,
&
wbuf
[
0
]
,
wchlen
)
;
std
::
vector

buf
(
wchlen
)
;
WideCharToMultiByte
(
1251
,
0
,
&
wbuf
[
0
]
,
wchlen
,
&
buf
[
0
]
,
wchlen
,
0
,
0
)
;
return
std
::
string
(
&
buf
[
0
]
,
wchlen
)
;
}
}
return
std
::
string
(
)
;
}



credits: https://www.cyberforum.ru/cpp-beginners/thread1249547.html
никогда не поздно научиться гуглить

C++:





Код:

regex_search
(
response
.
c_str
(
)
,
res
,
regex
(
"\"text\":\"(.+)\""
)
)
;
string message
=
res
[
1
]
;
SF
->
Log
(
"\u041f\u0440\u0438\u0432\u0435\u0442"
)
;
SF
->
Log
(
res
[
1
]
)
;
SF
->
Log
(
UTF8_to_CP1251
(
res
[
1
]
)
)
;



https://forum.antichat.xyz/attachments/27990541/

Ничего не изменилось

zTechnology 05.03.2022 15:56

Цитата:

Сообщение от vegas~

C++:





Код:

regex_search
(
response
.
c_str
(
)
,
res
,
regex
(
"\"text\":\"(.+)\""
)
)
;
string message
=
res
[
1
]
;
SF
->
Log
(
"\u041f\u0440\u0438\u0432\u0435\u0442"
)
;
SF
->
Log
(
res
[
1
]
)
;
SF
->
Log
(
UTF8_to_CP1251
(
res
[
1
]
)
)
;



Ничего не изменилось

https://forum.antichat.xyz/attachments/27990633/

Vegas 05.03.2022 16:03

Цитата:

Сообщение от zTechnology

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

zTechnology 05.03.2022 16:05

Цитата:

Сообщение от vegas~

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

напиши в вк/кинь под хайд полный код получения, попробую сделать готовый вариант для тебя

Vegas 05.03.2022 16:14

Цитата:

Сообщение от zTechnology

напиши в вк/кинь под хайд полный код получения, попробую сделать готовый вариант для тебя

Скрытое содержимое для пользователя(ей): zTechnology

zTechnology 05.03.2022 17:55

Цитата:

Сообщение от vegas~

*** Hidden text: cannot be quoted. ***

Скрытое содержимое для пользователя(ей):

Vegas 05.03.2022 19:03

Цитата:

Сообщение от zTechnology

*** Скрытый текст не может быть процитирован. ***

Ля, кнш как костыль ебейший выглядит но сук работает, поэтому выбирать не приходится)0

zTechnology 05.03.2022 19:05

Цитата:

Сообщение от vegas~

Ля, кнш как костыль ебейший выглядит но сук работает, поэтому выбирать не приходится)0

ну по другому никак, либо делать такую же замену на плюсах, чем на php

Dark_Knight 05.03.2022 20:27

Вопрос. А водится хоть в правильной кодировке?

Vegas 05.03.2022 21:09

Цитата:

Сообщение от Dark_Knight

Вопрос. А водится хоть в правильной кодировке?

Куда вводится?

Dark_Knight 05.03.2022 21:34

Цитата:

Сообщение от vegas~

Куда вводится?

Куда куда. В инпат. В Wndproc imgui на WM_CHAR у тебя как стоит? Вот тут уже с костылем, но полностью рабочим.

Цитата:

Сообщение от Спойлер


Vegas 05.03.2022 21:36

Цитата:

Сообщение от Dark_Knight

Куда куда. В инпат.

по конкретнее можно, ибо я не понимаю о чем речь

zTechnology 05.03.2022 22:30

Цитата:

Сообщение от Dark_Knight

Куда куда. В инпат. В Wndproc imgui на WM_CHAR у тебя как стоит? Вот тут уже с костылем, но полностью рабочим.
Цитата:

Сообщение от Спойлер




эм... а это тут причём?

Dark_Knight 05.03.2022 22:49

Цитата:

Сообщение от zTechnology

эм... а это тут причём?

У меня в сборке на многобайтовой кодировке работает так. По факту, вообще надо посмотреть откуда он инфу берёт, а то вообще может быть проблема не в этом.

zTechnology 05.03.2022 23:24

Цитата:

Сообщение от Dark_Knight

У меня в сборке на многобайтовой кодировке работает так. По факту, вообще надо посмотреть откуда он инфу берёт, а то вообще может быть проблема не в этом.

Эм.... Ну так причём тут WindProc к получению кодировки с телеги, когда телега русский текст через апи выводит так:

https://forum.antichat.xyz/attachments/27991004/

Либо ты не понял суть вопроса, в котором нуждался автор темы, либо я тебя сейчас не понимаю

Dark_Knight 06.03.2022 00:26

Цитата:

Сообщение от zTechnology

Эм.... Ну так причём тут WindProc к получению кодировки с телеги, когда телега русский текст через апи выводит так:

Либо ты не понял суть вопроса, в котором нуждался автор темы, либо я тебя сейчас не понимаю

У меня уже имгуи головного мозга 🤣🤣

kin4stat 06.03.2022 01:31

Цитата:

Сообщение от zTechnology

*** Скрытый текст не может быть процитирован. ***

Ну ты и насрал конечно говна что пиздец

Ради простейшей задачи которая решается двумя функциями спасченных с интернета, подключать хост. Еще и на хосте ***ни наделал. А если мне смайлик отправят в телеге? Или украинскую i?

Еще и под хайд убрал

C++:





Код:

#include
#include
std
::
vector

split
(
const
std
::
string
&
str
,
const
std
::
string
&
delim
)
{
std
::
vector

strings
;
size_t start
;
size_t end
=
0
;
while
(
(
start
=
str
.
find_first_not_of
(
delim
,
end
)
)
!=
std
::
string
::
npos
)
{
end
=
str
.
find
(
delim
,
start
)
;
strings
.
push_back
(
str
.
substr
(
start
,
end
-
start
)
)
;
}
return
strings
;
}
std
::
uint32_t
utf8_encode
(
char
*
out
,
uint32_t
utf
)
{
if
(
utf
>
6
)
&
0x1F
)
|
0xC0
)
;
out
[
1
]
=
(
char
)
(
(
(
utf
>>
0
)
&
0x3F
)
|
0x80
)
;
out
[
2
]
=
0
;
return
2
;
}
else
if
(
utf
>
12
)
&
0x0F
)
|
0xE0
)
;
out
[
1
]
=
(
char
)
(
(
(
utf
>>
6
)
&
0x3F
)
|
0x80
)
;
out
[
2
]
=
(
char
)
(
(
(
utf
>>
0
)
&
0x3F
)
|
0x80
)
;
out
[
3
]
=
0
;
return
3
;
}
else
if
(
utf
>
18
)
&
0x07
)
|
0xF0
)
;
out
[
1
]
=
(
char
)
(
(
(
utf
>>
12
)
&
0x3F
)
|
0x80
)
;
out
[
2
]
=
(
char
)
(
(
(
utf
>>
6
)
&
0x3F
)
|
0x80
)
;
out
[
3
]
=
(
char
)
(
(
(
utf
>>
0
)
&
0x3F
)
|
0x80
)
;
out
[
4
]
=
0
;
return
4
;
}
else
{
// error - use replacement character
out
[
0
]
=
(
char
)
0xEF
;
out
[
1
]
=
(
char
)
0xBF
;
out
[
2
]
=
(
char
)
0xBD
;
out
[
3
]
=
0
;
return
0
;
}
}
std
::
string
cp_to_utf8
(
const
std
::
string
&
input
)
{
std
::
string out
;
auto
points
=
split
(
input
,
R"(\u)"
)
;
for
(
auto
&
p
:
points
)
{
char
buf
[
8
]
;
auto
len
=
utf8_encode
(
buf
,
std
::
stoi
(
p
,
nullptr
,
16
)
)
;
out
.
append
(
std
::
string
{
buf
,
len
}
)
;
}
return
out
;
}



usage:

C++:





[CODE]
int
main
(
)
{
setlocale
(
LC_ALL
,
"en_US.utf8"
)
;
std
::
string input
=
R"(\u041f\u0440\u0438\u0432\u0435\u0442)"
;
std
::
cout


x0r1x 06.03.2022 01:59

[QUOTE="kin4stat"]

Ну ты и насрал конечно говна что пиздец

Ради простейшей задачи которая решается двумя функциями спасченных с интернета, подключать хост. Еще и на хосте ***ни наделал. А если мне смайлик отправят в телеге? Или украинскую i?
Еще и под хайд убрал

C++:





Код:

#include
#include
std
::
vector

split
(
const
std
::
string
&
str
,
const
std
::
string
&
delim
)
{
std
::
vector

strings
;
size_t start
;
size_t end
=
0
;
while
(
(
start
=
str
.
find_first_not_of
(
delim
,
end
)
)
!=
std
::
string
::
npos
)
{
end
=
str
.
find
(
delim
,
start
)
;
strings
.
push_back
(
str
.
substr
(
start
,
end
-
start
)
)
;
}
return
strings
;
}
std
::
uint32_t
utf8_encode
(
char
*
out
,
uint32_t
utf
)
{
if
(
utf
>
6
)
&
0x1F
)
|
0xC0
)
;
out
[
1
]
=
(
char
)
(
(
(
utf
>>
0
)
&
0x3F
)
|
0x80
)
;
out
[
2
]
=
0
;
return
2
;
}
else
if
(
utf
>
12
)
&
0x0F
)
|
0xE0
)
;
out
[
1
]
=
(
char
)
(
(
(
utf
>>
6
)
&
0x3F
)
|
0x80
)
;
out
[
2
]
=
(
char
)
(
(
(
utf
>>
0
)
&
0x3F
)
|
0x80
)
;
out
[
3
]
=
0
;
return
3
;
}
else
if
(
utf
>
18
)
&
0x07
)
|
0xF0
)
;
out
[
1
]
=
(
char
)
(
(
(
utf
>>
12
)
&
0x3F
)
|
0x80
)
;
out
[
2
]
=
(
char
)
(
(
(
utf
>>
6
)
&
0x3F
)
|
0x80
)
;
out
[
3
]
=
(
char
)
(
(
(
utf
>>
0
)
&
0x3F
)
|
0x80
)
;
out
[
4
]
=
0
;
return
4
;
}
else
{
// error - use replacement character
out
[
0
]
=
(
char
)
0xEF
;
out
[
1
]
=
(
char
)
0xBF
;
out
[
2
]
=
(
char
)
0xBD
;
out
[
3
]
=
0
;
return
0
;
}
}
std
::
string
cp_to_utf8
(
const
std
::
string
&
input
)
{
std
::
string out
;
auto
points
=
split
(
input
,
R"(\u)"
)
;
for
(
auto
&
p
:
points
)
{
char
buf
[
8
]
;
auto
len
=
utf8_encode
(
buf
,
std
::
stoi
(
p
,
nullptr
,
16
)
)
;
out
.
append
(
std
::
string
{
buf
,
len
}
)
;
}
return
out
;
}



usage:

C++:





[CODE]
int
main
(
)
{
setlocale
(
LC_ALL
,
"en_US.utf8"
)
;
std
::
string input
=
R"(\u041f\u0440\u0438\u0432\u0435\u0442)"
;
std
::
cout

Dark_Knight 06.03.2022 02:10

Цитата:

Сообщение от x0r1x

про директивы вы забыли? или стал даркпикселем?

Слушай, а давай мы за тебя еще и посрем.

Vegas 06.03.2022 02:19

[QUOTE="kin4stat"]

Ну ты и насрал конечно говна что пиздец

Ради простейшей задачи которая решается двумя функциями спасченных с интернета, подключать хост. Еще и на хосте ***ни наделал. А если мне смайлик отправят в телеге? Или украинскую i?
Еще и под хайд убрал

C++:





Код:

#include
#include
std
::
vector

split
(
const
std
::
string
&
str
,
const
std
::
string
&
delim
)
{
std
::
vector

strings
;
size_t start
;
size_t end
=
0
;
while
(
(
start
=
str
.
find_first_not_of
(
delim
,
end
)
)
!=
std
::
string
::
npos
)
{
end
=
str
.
find
(
delim
,
start
)
;
strings
.
push_back
(
str
.
substr
(
start
,
end
-
start
)
)
;
}
return
strings
;
}
std
::
uint32_t
utf8_encode
(
char
*
out
,
uint32_t
utf
)
{
if
(
utf
>
6
)
&
0x1F
)
|
0xC0
)
;
out
[
1
]
=
(
char
)
(
(
(
utf
>>
0
)
&
0x3F
)
|
0x80
)
;
out
[
2
]
=
0
;
return
2
;
}
else
if
(
utf
>
12
)
&
0x0F
)
|
0xE0
)
;
out
[
1
]
=
(
char
)
(
(
(
utf
>>
6
)
&
0x3F
)
|
0x80
)
;
out
[
2
]
=
(
char
)
(
(
(
utf
>>
0
)
&
0x3F
)
|
0x80
)
;
out
[
3
]
=
0
;
return
3
;
}
else
if
(
utf
>
18
)
&
0x07
)
|
0xF0
)
;
out
[
1
]
=
(
char
)
(
(
(
utf
>>
12
)
&
0x3F
)
|
0x80
)
;
out
[
2
]
=
(
char
)
(
(
(
utf
>>
6
)
&
0x3F
)
|
0x80
)
;
out
[
3
]
=
(
char
)
(
(
(
utf
>>
0
)
&
0x3F
)
|
0x80
)
;
out
[
4
]
=
0
;
return
4
;
}
else
{
// error - use replacement character
out
[
0
]
=
(
char
)
0xEF
;
out
[
1
]
=
(
char
)
0xBF
;
out
[
2
]
=
(
char
)
0xBD
;
out
[
3
]
=
0
;
return
0
;
}
}
std
::
string
cp_to_utf8
(
const
std
::
string
&
input
)
{
std
::
string out
;
auto
points
=
split
(
input
,
R"(\u)"
)
;
for
(
auto
&
p
:
points
)
{
char
buf
[
8
]
;
auto
len
=
utf8_encode
(
buf
,
std
::
stoi
(
p
,
nullptr
,
16
)
)
;
out
.
append
(
std
::
string
{
buf
,
len
}
)
;
}
return
out
;
}



usage:

C++:





[CODE]
int
main
(
)
{
setlocale
(
LC_ALL
,
"en_US.utf8"
)
;
std
::
string input
=
R"(\u041f\u0440\u0438\u0432\u0435\u0442)"
;
std
::
cout

https://forum.antichat.xyz/attachments/27991114/

А если без этого использовать то при наличии в строке любых символов кроме русских игра вылетает

kin4stat 06.03.2022 03:21

Цитата:

Сообщение от vegas~

А если без этого использовать то при наличии в строке любых символов кроме русских игра вылетает

Функция текст в utf-8 выдает. Консоль SF в CP1251 работает

Vegas 06.03.2022 03:25

Цитата:

Сообщение от kin4stat

Функция текст в utf-8 выдает. Консоль SF в CP1251 работает

Я знаю, поэтому я переводил текст в cp. Но что с что без - никак не поменялось.

kin4stat 06.03.2022 03:26

Цитата:

Сообщение от vegas~

Я знаю, поэтому я переводил текст в cp. Но что с что без - никак не поменялось.

Покажи как строку используешь

Vegas 06.03.2022 03:28

Цитата:

Сообщение от kin4stat

Покажи как строку используешь

SF->Log(utf8_to_cp(cp_to_utf8(message)));

Dark_Knight 06.03.2022 10:22

Цитата:

Сообщение от vegas~

SF->Log(utf8_to_cp(cp_to_utf8(message)));

Так надо просто же utf8_to_cp

Vegas 06.03.2022 13:13

Цитата:

Сообщение от Dark_Knight

Так надо просто же utf8_to_cp

Эта функция работает только для utf8 текста, а у меня из телеграмм приходит Unicode-escape текст

Dark_Knight 06.03.2022 18:19

Щас кое-что попробую. Если получится, то отпишу после 21 по Киеву.

kin4stat 06.03.2022 19:25

Цитата:

Сообщение от vegas~

Эта функция работает только для utf8 текста, а у меня из телеграмм приходит Unicode-escape текст

так я же скинул как unicode escape текст переводить....

Vegas 06.03.2022 19:47

Цитата:

Сообщение от kin4stat

так я же скинул как unicode escape текст переводить....

Причем тут это, проблема в том что при входе Английской буквы в твою функцию cp_to_utf8 игра крашит

kin4stat 06.03.2022 21:14

Цитата:

Сообщение от vegas~

Причем тут это, проблема в том что при входе Английской буквы в твою функцию cp_to_utf8 игра крашит

Сказал бы сразу

C++:





Код:

#include
#include
#include
#include
std
::
vector

split
(
const
std
::
string
&
str
,
const
std
::
string
&
delim
)
{
std
::
vector

strings
;
size_t start
;
size_t end
=
0
;
while
(
(
start
=
str
.
find_first_not_of
(
delim
,
end
)
)
!=
std
::
string
::
npos
)
{
end
=
str
.
find
(
delim
,
start
)
;
strings
.
push_back
(
str
.
substr
(
start
,
end
-
start
)
)
;
}
return
strings
;
}
std
::
uint32_t
utf8_encode
(
char
*
out
,
uint32_t
utf
)
{
if
(
utf
>
6
)
&
0x1F
)
|
0xC0
)
;
out
[
1
]
=
(
char
)
(
(
(
utf
>>
0
)
&
0x3F
)
|
0x80
)
;
out
[
2
]
=
0
;
return
2
;
}
else
if
(
utf
>
12
)
&
0x0F
)
|
0xE0
)
;
out
[
1
]
=
(
char
)
(
(
(
utf
>>
6
)
&
0x3F
)
|
0x80
)
;
out
[
2
]
=
(
char
)
(
(
(
utf
>>
0
)
&
0x3F
)
|
0x80
)
;
out
[
3
]
=
0
;
return
3
;
}
else
if
(
utf
>
18
)
&
0x07
)
|
0xF0
)
;
out
[
1
]
=
(
char
)
(
(
(
utf
>>
12
)
&
0x3F
)
|
0x80
)
;
out
[
2
]
=
(
char
)
(
(
(
utf
>>
6
)
&
0x3F
)
|
0x80
)
;
out
[
3
]
=
(
char
)
(
(
(
utf
>>
0
)
&
0x3F
)
|
0x80
)
;
out
[
4
]
=
0
;
return
4
;
}
else
{
// error - use replacement character
out
[
0
]
=
(
char
)
0xEF
;
out
[
1
]
=
(
char
)
0xBF
;
out
[
2
]
=
(
char
)
0xBD
;
out
[
3
]
=
0
;
return
0
;
}
}
std
::
string
cp_to_utf8
(
const
std
::
string
&
input
)
{
std
::
string out
;
std
::
regex
re
(
R"((?:(?:\\\\)|(?:\\[uU](?:[0-9a-fA-F]{8}|[0-9a-fA-F]{4})))|(?:.))"
)
;
std
::
regex_token_iterator
it
(
input
.
cbegin
(
)
,
input
.
cend
(
)
,
re
)
;
decltype
(
it
)
end
;
for
(
;
it
!=
end
;
++
it
)
{
auto
ms
=
it
->
str
(
)
;
if
(
ms
.
rfind
(
"\\u"
)
==
0
||
ms
.
rfind
(
"\\U"
)
==
0
)
{
auto
s
=
ms
.
substr
(
2
)
;
unsigned
int
value
;
auto
[
ptr
,
err
]
=
std
::
from_chars
(
s
.
c_str
(
)
,
s
.
c_str
(
)
+
s
.
size
(
)
,
value
,
16
)
;
if
(
err
==
std
::
errc
(
)
)
{
char
buf
[
8
]
;
auto
len
=
utf8_encode
(
buf
,
value
)
;
if
(
!
len
)
{
throw
std
::
invalid_argument
{
"Invalid unicode codepoint 0x"
s
+
hex
}
;
}
out
.
append
(
std
::
string
{
buf
,
len
}
)
;
}
else
if
(
err
==
std
::
errc
::
invalid_argument
)
{
throw
std
::
invalid_argument
{
s
}
;
}
else
if
(
err
==
std
::
errc
::
result_out_of_range
)
{
throw
std
::
out_of_range
{
s
}
;
}
}
else
{
out
.
append
(
ms
)
;
}
}
return
out
;
}



same shit без регулярок:

C++:





[CODE]
#include
#include
#include
#include
std
::
vector

split
(
const
std
::
string
&
str
,
const
std
::
string
&
delim
)
{
std
::
vector

strings
;
size_t start
;
size_t end
=
0
;
while
(
(
start
=
str
.
find_first_not_of
(
delim
,
end
)
)
!=
std
::
string
::
npos
)
{
end
=
str
.
find
(
delim
,
start
)
;
strings
.
push_back
(
str
.
substr
(
start
,
end
-
start
)
)
;
}
return
strings
;
}
std
::
uint32_t
utf8_encode
(
char
*
out
,
uint32_t
utf
)
{
if
(
utf
>
6
)
&
0x1F
)
|
0xC0
)
;
out
[
1
]
=
(
char
)
(
(
(
utf
>>
0
)
&
0x3F
)
|
0x80
)
;
out
[
2
]
=
0
;
return
2
;
}
else
if
(
utf
>
12
)
&
0x0F
)
|
0xE0
)
;
out
[
1
]
=
(
char
)
(
(
(
utf
>>
6
)
&
0x3F
)
|
0x80
)
;
out
[
2
]
=
(
char
)
(
(
(
utf
>>
0
)
&
0x3F
)
|
0x80
)
;
out
[
3
]
=
0
;
return
3
;
}
else
if
(
utf
>
18
)
&
0x07
)
|
0xF0
)
;
out
[
1
]
=
(
char
)
(
(
(
utf
>>
12
)
&
0x3F
)
|
0x80
)
;
out
[
2
]
=
(
char
)
(
(
(
utf
>>
6
)
&
0x3F
)
|
0x80
)
;
out
[
3
]
=
(
char
)
(
(
(
utf
>>
0
)
&
0x3F
)
|
0x80
)
;
out
[
4
]
=
0
;
return
4
;
}
else
{
// error - use replacement character
out
[
0
]
=
(
char
)
0xEF
;
out
[
1
]
=
(
char
)
0xBF
;
out
[
2
]
=
(
char
)
0xBD
;
out
[
3
]
=
0
;
return
0
;
}
}
std
::
string
cp_to_utf8
(
const
std
::
string
&
input
)
{
using
namespace
std
::
string_literals
;
std
::
string out
;
for
(
auto
i
=
0u
;
i



Ну и тест:

C++:





[CODE]
#include
int
main
(
)
{
setlocale
(
LC_ALL
,
"en_US.utf8"
)
;
std
::
string input
=
u8
R"(КекЛолPizda\u041f\u0440\u0438\u0432\u0435 \u0442)"
;
std
::
cout


Vegas 06.03.2022 21:45

[QUOTE="kin4stat"]

Сказал бы сразу

C++:





Код:

#include
#include
#include
#include
std
::
vector

split
(
const
std
::
string
&
str
,
const
std
::
string
&
delim
)
{
std
::
vector

strings
;
size_t start
;
size_t end
=
0
;
while
(
(
start
=
str
.
find_first_not_of
(
delim
,
end
)
)
!=
std
::
string
::
npos
)
{
end
=
str
.
find
(
delim
,
start
)
;
strings
.
push_back
(
str
.
substr
(
start
,
end
-
start
)
)
;
}
return
strings
;
}
std
::
uint32_t
utf8_encode
(
char
*
out
,
uint32_t
utf
)
{
if
(
utf
>
6
)
&
0x1F
)
|
0xC0
)
;
out
[
1
]
=
(
char
)
(
(
(
utf
>>
0
)
&
0x3F
)
|
0x80
)
;
out
[
2
]
=
0
;
return
2
;
}
else
if
(
utf
>
12
)
&
0x0F
)
|
0xE0
)
;
out
[
1
]
=
(
char
)
(
(
(
utf
>>
6
)
&
0x3F
)
|
0x80
)
;
out
[
2
]
=
(
char
)
(
(
(
utf
>>
0
)
&
0x3F
)
|
0x80
)
;
out
[
3
]
=
0
;
return
3
;
}
else
if
(
utf
>
18
)
&
0x07
)
|
0xF0
)
;
out
[
1
]
=
(
char
)
(
(
(
utf
>>
12
)
&
0x3F
)
|
0x80
)
;
out
[
2
]
=
(
char
)
(
(
(
utf
>>
6
)
&
0x3F
)
|
0x80
)
;
out
[
3
]
=
(
char
)
(
(
(
utf
>>
0
)
&
0x3F
)
|
0x80
)
;
out
[
4
]
=
0
;
return
4
;
}
else
{
// error - use replacement character
out
[
0
]
=
(
char
)
0xEF
;
out
[
1
]
=
(
char
)
0xBF
;
out
[
2
]
=
(
char
)
0xBD
;
out
[
3
]
=
0
;
return
0
;
}
}
std
::
string
cp_to_utf8
(
const
std
::
string
&
input
)
{
std
::
string out
;
std
::
regex
re
(
R"((?:(?:\\\\)|(?:\\[uU](?:[0-9a-fA-F]{8}|[0-9a-fA-F]{4})))|(?:.))"
)
;
std
::
regex_token_iterator
it
(
input
.
cbegin
(
)
,
input
.
cend
(
)
,
re
)
;
decltype
(
it
)
end
;
for
(
;
it
!=
end
;
++
it
)
{
auto
ms
=
it
->
str
(
)
;
if
(
ms
.
rfind
(
"\\u"
)
==
0
||
ms
.
rfind
(
"\\U"
)
==
0
)
{
auto
s
=
ms
.
substr
(
2
)
;
unsigned
int
value
;
auto
[
ptr
,
err
]
=
std
::
from_chars
(
s
.
c_str
(
)
,
s
.
c_str
(
)
+
s
.
size
(
)
,
value
,
16
)
;
if
(
err
==
std
::
errc
(
)
)
{
char
buf
[
8
]
;
auto
len
=
utf8_encode
(
buf
,
value
)
;
if
(
!
len
)
{
throw
std
::
invalid_argument
{
"Invalid unicode codepoint 0x"
s
+
hex
}
;
}
out
.
append
(
std
::
string
{
buf
,
len
}
)
;
}
else
if
(
err
==
std
::
errc
::
invalid_argument
)
{
throw
std
::
invalid_argument
{
s
}
;
}
else
if
(
err
==
std
::
errc
::
result_out_of_range
)
{
throw
std
::
out_of_range
{
s
}
;
}
}
else
{
out
.
append
(
ms
)
;
}
}
return
out
;
}



same shit без регулярок:

C++:





[CODE]
#include
#include
#include
#include
std
::
vector

split
(
const
std
::
string
&
str
,
const
std
::
string
&
delim
)
{
std
::
vector

strings
;
size_t start
;
size_t end
=
0
;
while
(
(
start
=
str
.
find_first_not_of
(
delim
,
end
)
)
!=
std
::
string
::
npos
)
{
end
=
str
.
find
(
delim
,
start
)
;
strings
.
push_back
(
str
.
substr
(
start
,
end
-
start
)
)
;
}
return
strings
;
}
std
::
uint32_t
utf8_encode
(
char
*
out
,
uint32_t
utf
)
{
if
(
utf
>
6
)
&
0x1F
)
|
0xC0
)
;
out
[
1
]
=
(
char
)
(
(
(
utf
>>
0
)
&
0x3F
)
|
0x80
)
;
out
[
2
]
=
0
;
return
2
;
}
else
if
(
utf
>
12
)
&
0x0F
)
|
0xE0
)
;
out
[
1
]
=
(
char
)
(
(
(
utf
>>
6
)
&
0x3F
)
|
0x80
)
;
out
[
2
]
=
(
char
)
(
(
(
utf
>>
0
)
&
0x3F
)
|
0x80
)
;
out
[
3
]
=
0
;
return
3
;
}
else
if
(
utf
>
18
)
&
0x07
)
|
0xF0
)
;
out
[
1
]
=
(
char
)
(
(
(
utf
>>
12
)
&
0x3F
)
|
0x80
)
;
out
[
2
]
=
(
char
)
(
(
(
utf
>>
6
)
&
0x3F
)
|
0x80
)
;
out
[
3
]
=
(
char
)
(
(
(
utf
>>
0
)
&
0x3F
)
|
0x80
)
;
out
[
4
]
=
0
;
return
4
;
}
else
{
// error - use replacement character
out
[
0
]
=
(
char
)
0xEF
;
out
[
1
]
=
(
char
)
0xBF
;
out
[
2
]
=
(
char
)
0xBD
;
out
[
3
]
=
0
;
return
0
;
}
}
std
::
string
cp_to_utf8
(
const
std
::
string
&
input
)
{
using
namespace
std
::
string_literals
;
std
::
string out
;
for
(
auto
i
=
0u
;
i

int
main
(
)
{
setlocale
(
LC_ALL
,
"en_US.utf8"
)
;
std
::
string input
=
u8
R"(КекЛолPizda\u041f\u0440\u0438\u0432\u0435 \u0442)"
;
std
::
cout


Время: 16:10