Лучше избежать преобразования кодировок, если нету весомой причины для обратного. Лучше будет использовать одну и ту же кодировку и на сервере, и на клиенте.
Если все же требуется преобразовать кодировку, то можно воспользоваться библиотекой ICU, документацию к ней можно найти на их сайте.
Пример преобразования 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
)
;
}
|