Я использую Facebook API с их официальной библиотекой PHP. У меня есть код, который публикует контент в Facebook, однако смайлики не публикуются. Это код:
public function postToFacebook() {
$stripped_question = App::unclean($this->getQuestion());
$question_id = $this->getId();
$answer = $this->getAnswer();
if ((!!$answer) && (strlen($answer) > 10)) {
$answer = substr($answer, 0, strlen($answer) / 2)."...";
}
$uri = QM::$mainSiteName."question/question/qid/$question_id/";
$desc = "";
$caption = App::unclean($answer);
$title = $stripped_question;
$pic = QM::$mainSiteName . "images/facebook-attachment.png";
$action_name = "Ask " . $_SESSION["username"] . " anything";
$action_link = QM::$mainSiteName . $_SESSION["username"];
$msg = "";
App::CurrentUser()->postToFacebookWall($title, $uri, $desc, $msg, $pic, $caption, $action_name, $action_link);
}
App :: нечистый:
public static function unclean($var) {
return QM::filterText(stripslashes(trim($var)));
}
QM :: filterText:
public static function filterText($text) {
return str_replace(array('<br />', '<br/>', '<br>'), '<br>', htmlspecialchars($text));
}
И, наконец, код, который публикуется в Facebook:
public function postToFacebookWall($title, $uri, $desc, $msg = null, $pic = null, $caption = null, $action_name = null, $action_link = null, $uid = 'me') {
try {
$data = array(
'name' => $title,
'link' => $uri,
'description' => $desc
);
if ($pic) {
$data['picture'] = $pic;
}
if ($caption) {
$data['caption'] = $caption;
}
if ($action_name) {
$data['actions'] = json_encode(array('name' => $action_name, 'link' => $action_link));
}
Facebook\FacebookAccessor\FacebookAction::facebookActionFactory("post", array("url" => QM::$mainSiteName, "params" => $data));
} catch (Exception $e) {
return false;
}
return true;
}
Все отлично работает, кроме того, что смайлики не показываются. Что следует изменить, если вопрос и / или ответ содержат смайлики, чтобы показать все, в том числе смайлики на Facebook?
Эти шаги решили эту проблему для меня:
Пример:
ALTER DATABASE {database_name} CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE {table_name} CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE {table_name} CHANGE {column_name} VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
И обратите внимание, что при преобразовании из utf8 в utf8mb4 максимальная длина столбца или индексного ключа не изменяется в байтах. Следовательно, он меньше с точки зрения символов, поскольку максимальная длина символа теперь составляет четыре байта вместо трех.
Других решений пока нет …