Ошибка при отправке или получении? Полное сообщение не отправлено или сообщение не декодировано должным образом

Поэтому я отправляю некоторые данные из моего настольного приложения C ++ на мой сервер (скрипт PHP).

Не все почтовые данные получены сервером. Как вы думаете, где происходит ошибка? При декодировании на стороне сервера (UTF-8) или при передаче на стороне клиента?

Код C ++: обратите внимание на его Unicode. Если я отправляю ASCII, скрипт получает / декодирует всю строку данных поста:

static TCHAR hdrs[] =
_T("Content-Type: application/x-www-form-urlencoded; charset=UTF-8\0\0");
static TCHAR frmdata[] =
_T("name=John+Doe&auth=abc\0\0");  // use 2 null chars just incase
static LPSTR accept[2] = { "*/*", NULL };HINTERNET hSession = InternetOpen(_T("MyAgent"),
INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
// error checking removed but none of these fail

HINTERNET hConnect = InternetConnect(hSession, _T("mydomain.com"),
INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);

HINTERNET hRequest = HttpOpenRequest(hConnect, _T("POST"),
_T("upload.php"), NULL, NULL, (LPCWSTR*)&accept, INTERNET_FLAG_NO_CACHE_WRITE, 1);HttpSendRequest(hRequest, hdrs, _tcslen(hdrs), frmdata, _tcslen(frmdata));
// The above function returns true and I query the response code and its HTTP 200 ok so sending is working

Простой скрипт PHP:

$data = file_get_contents("php://input");
file_put_contents("post.txt", $data);  // outputs "name=John+D" so its missing text

// To make things even more confusing
echo mb_detect_encoding($data); // outputs ASCII!!!???

Странно, если я отправляю как ASCII, скрипт получает / декодирует все данные поста

static char hdrs[] =
_T("Content-Type: application/x-www-form-urlencoded; charset=UTF-8\0\0");
static char frmdata[] =
_T("name=John+Doe&auth=abc\0\0");
static LPCSTR accept[2] = { "*/*", NULL };

...

HttpSendRequestA(hRequest, hdrs, strlen(hdrs), frmdata, strlen(frmdata));
// The above function returns true and I query the response code and its HTTP 200 ok so sending is working

С ASCII post.txt содержит name=John+Doe&auth=abc, Так где же будет ошибка? Разве не вся строка сообщения отправлена ​​или скрипт PHP не обрабатывает юникод правильно?

0

Решение

Вы отправляете не всех персонажей. Вы также неправильно указали кодировку.

wchar_t *s1 = L"abc"; не в кодировке UTF-8
char *s2 = "abc"; бывает в кодировке UTF-8 (это хорошее свойство UTF-8), но с этой нотацией вы ограничены латинскими символами. Смотрите пример ниже.

_tcslen (frmdata) возвращает количество символов, а не байтов. Строка занимает больше байтов, чем символов, если вы определяете Unicode. Ваш сервер ожидает последовательность байтов UTF-8, но фактическая кодировка не UTF-8.

Несколько примеров того, как указывать буквенные строки кодирование в C ++ 11

// Greek small letter tau
char const *tau8 = u8"\u03C4"; // UTF-8
char16_t tau16 = u'\u03C4';    // UTF-16
wchar_t tau32 = U'\U000003C4'; // UTF-32
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]