PDA

Просмотр полной версии : Кодировка


smvrty
11.05.2021, 13:06
Проблема такая: реализовал общение между клиентом и сервером через RPC.

Проблема в том, что клиент отправляет на сервер инфу в UTF8, а нужно принимать в cp1251.

Как грамотнее решить проблему с кодировками?

#Rin
11.05.2021, 19:05
Лучше избежать преобразования кодировок, если нету весомой причины для обратного. Лучше будет использовать одну и ту же кодировку и на сервере, и на клиенте.

Если все же требуется преобразовать кодировку, то можно воспользоваться библиотекой ICU (https://github.com/unicode-org/icu), документацию к ней можно найти на их сайте (https://www.blast.hk/redirect/aHR0cDovL3NpdGUuaWN1LXByb2plY3Qub3JnLw).

Пример преобразования UTF-8 в 1251:

C++:






#include
#include
#include
#include
#include
#include
bool
convertUtf8To1251
(
const
std
::
string
&
input
,
std
::
string
&
output
)
{
const
std
::
string
::
size_type inputLength
=
input
.
size
(
)
;
std
::
vector

inputChars
(
inputLength
)
;
UErrorCode status
=
U_ZERO_ERROR
;
UConverter
*
conv
=
ucnv_open
(
"UTF-8"
,
&
status
)
;
if
(
!
U_SUCCESS
(
status
)
)
{
return
false
;
}
std
::
shared_ptr

cnv
(
conv
,
ucnv_close
)
;
int32_t
inputCharsLength
=
ucnv_toUChars
(
conv
,
inputChars
.
data
(
)
,
inputLength
,
input
.
c_str
(
)
,
inputLength
,
&
status
)
;
if
(
!
U_SUCCESS
(
status
)
)
{
return
false
;
}
UConverter
*
toconv
=
ucnv_open
(
"windows-1251"
,
&
status
)
;
if
(
!
U_SUCCESS
(
status
)
)
{
return
false
;
}
std
::
shared_ptr

tocnv
(
toconv
,
ucnv_close
)
;
UChar
const
*
source
=
inputChars
.
data
(
)
;
UChar
const
*
sourceLimit
=
source
+
inputCharsLength
;
output
.
resize
(
inputCharsLength
)
;
char
*
target
=
output
.
data
(
)
;
char
*
targetLimit
=
target
+
inputCharsLength
;
ucnv_fromUnicode
(
toconv
,
&
target
,
targetLimit
,
&
source
,
sourceLimit
,
nullptr
,
true
,
&
status
)
;
return
U_SUCCESS
(
status
)
;
}