я написал скрипт php, который получает пакеты http POST из программы-клиента windows.
клиент Windows использует «WinHttpClient«для C ++.
WinHttpClient принимает сообщения, которые я отправляю как wchar_t.
проблема в том, что я получаю сообщения в своем PHP-файле, но некоторые знаки, такие как знак «®», отображаются как «Â®».
насколько я знаю, я не могу изменить кодировку моего клиента на utf-8 или что-то в этом роде.
но, может быть, некоторые люди здесь знают, как «преобразовать» широкие символы в utf8, с которым PHP может нормально работать. Потому что я должен сохранить данные в базе данных, которая работает только с utf-8.
Я попробовал это со следующим, но это не меняет это 🙁
function ewchar_to_utf8($matches) {
$ewchar = $matches[1];
$binwchar = hexdec($ewchar);
$wchar = chr(($binwchar >> 8) & 0xFF) . chr(($binwchar) & 0xFF);
return iconv("unicodebig", "utf-8", $wchar);
}
function special_unicode_to_utf8($str) {
return preg_replace_callback("/\\\u([[:xdigit:]]{4})/i", "ewchar_to_utf8", $str);
}
может быть, у вас есть идеи 🙂 Спасибо
проблема в том, что я получаю сообщения в моем PHP-файле, но некоторые
знаки, такие как знак «®», отображаются как «®».
Это означает, что у вас уже есть UTF-8 … неправильно истолкованный в ISO-8859-1 / Windows-1252.
Если это так
<?php
echo $rsymbol; //Comes out as ®
Тогда все что нужно поменять:
<?php
header("Content-Type: text/html; charset=UTF-8");
echo $rsymbol; //Comes out as ®
Windows wchar_t — это UTF-16LE, поэтому попробуйте $u8str = iconv('UTF-16LE', 'UTF-8', $input);
Но из того, что я вижу на сайте WinHttpClient, он имеет _b_str
класс, так что вы можете преобразовать в байты — он не говорит, если это через UTF-8, но если все остальное не удается, вы можете использовать WideCharToMultiByte () с CP_UTF8
кодовая страница, чтобы получить подходящий байтовый буфер для POST.
Это хорошая PHP-функция, используемая для преобразования всей строки, которую вы получаете в wchar_t, в UTF-8: http://php.net/manual/en/function.mb-convert-encoding.php — Используйте PHP Info, чтобы убедиться, что версия вашего PHP поддерживает MultiByte Strings.
Библиотека MultiByte может помочь вам, если вы не уверены также в кодировке с помощью mb_detect_encoding () или для проверки того, что строка находится в определенной кодировке, с помощью mb_check_encoding ().