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

  #1  
Старый 11.05.2021, 13:06
smvrty
Новичок
Регистрация: 10.11.2020
Сообщений: 29
С нами: 2899504

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

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

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

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

  #2  
Старый 11.05.2021, 19:05
#Rin
Познавший АНТИЧАТ
Регистрация: 09.08.2015
Сообщений: 1,213
С нами: 5663255

Репутация: 183


По умолчанию

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

Если все же требуется преобразовать кодировку, то можно воспользоваться библиотекой 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
)
;
}
 
Ответить с цитированием
Ответ



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

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


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




ANTICHAT ™ © 2001- Antichat Kft.