ANTICHAT Forum
HOME FORUMS MEMBERS RECENT POSTS LOG IN  
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > Общие вопросы программирования
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #31  
Старый 06.03.2022, 03:25
Vegas
Новичок
Регистрация: 03.08.2007
Сообщений: 11
С нами: 9879517

Репутация: 1
По умолчанию

Цитата:
Сообщение от kin4stat  

Функция текст в utf-8 выдает. Консоль SF в CP1251 работает
Я знаю, поэтому я переводил текст в cp. Но что с что без - никак не поменялось.
 
Ответить с цитированием

  #32  
Старый 06.03.2022, 03:26
kin4stat
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами: 4483143

Репутация: 183


По умолчанию

Цитата:
Сообщение от vegas~  

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

  #33  
Старый 06.03.2022, 03:28
Vegas
Новичок
Регистрация: 03.08.2007
Сообщений: 11
С нами: 9879517

Репутация: 1
По умолчанию

Цитата:
Сообщение от kin4stat  

Покажи как строку используешь
SF->Log(utf8_to_cp(cp_to_utf8(message)));
 
Ответить с цитированием

  #34  
Старый 06.03.2022, 10:22
Dark_Knight
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами: 6921957

Репутация: 183


По умолчанию

Цитата:
Сообщение от vegas~  

SF->Log(utf8_to_cp(cp_to_utf8(message)));
Так надо просто же utf8_to_cp
 
Ответить с цитированием

  #35  
Старый 06.03.2022, 13:13
Vegas
Новичок
Регистрация: 03.08.2007
Сообщений: 11
С нами: 9879517

Репутация: 1
По умолчанию

Цитата:
Сообщение от Dark_Knight  

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

  #36  
Старый 06.03.2022, 18:19
Dark_Knight
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами: 6921957

Репутация: 183


По умолчанию

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

  #37  
Старый 06.03.2022, 19:25
kin4stat
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами: 4483143

Репутация: 183


По умолчанию

Цитата:
Сообщение от vegas~  

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

  #38  
Старый 06.03.2022, 19:47
Vegas
Новичок
Регистрация: 03.08.2007
Сообщений: 11
С нами: 9879517

Репутация: 1
По умолчанию

Цитата:
Сообщение от kin4stat  

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

  #39  
Старый 06.03.2022, 21:14
kin4stat
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами: 4483143

Репутация: 183


По умолчанию

Цитата:
Сообщение от 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

 
Ответить с цитированием

  #40  
Старый 06.03.2022, 21:45
Vegas
Новичок
Регистрация: 03.08.2007
Сообщений: 11
С нами: 9879517

Репутация: 1
По умолчанию

[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
 
Ответить с цитированием
Ответ



Предыдущая тема Следующая тема

Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.