Поэтому я отправляю некоторые данные из моего настольного приложения 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 не обрабатывает юникод правильно?
Вы отправляете не всех персонажей. Вы также неправильно указали кодировку.
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
Других решений пока нет …