Печать смайликов с использованием UTF-16 десятичного PHP - PullRequest
1 голос
/ 17 апреля 2019

Так что в настоящее время у меня есть строка в десятичном формате UTF-16, которую я конвертирую с помощью chr ().

По большей части работает нормально, но на смайликах не получается.

Я запустил пример в js, который отлично работает, вот этот пример

console.log(String.fromCharCode(84,104,105,115,32,105,115,32,97,32,116,101,115,116,32,119,105,116,104,32,97,110,32,101,109,111,106,105,32,55357,56834,32))

, который производит

This is a test with an emoji ? 

Но когда я пытаюсь сделать это в PHP, это то, что я получаю

function fromCharCode() {
    return array_reduce(func_get_args(),function($a,$b){$a.=chr($b);return $a;});
}
print(fromCharCode(84,104,105,115,32,105,115,32,97,32,116,101,115,116,32,119,105,116,104,32,97,110,32,101,109,111,106,105,32,55357,56834,32));

Результат:

This is a test with an emoji =

Теперь я обнаружил, что js позволяет мне принимать String.fromCharCode(55357,56834), который производит ?

но PHP chr() позволяет принимать только по одному за раз, что означает, что я не могу создавать эмодзи.

Кто-нибудь знает способ сделать это, исправляя текущий код или используя другую функцию?

Редактировать: Таким образом, вы получите еще немного фона, строка, с которой я должен начать, это HEX UTF-16 005400680069007300200069007300200061002000740065007300740020007700690074006800200061006E00200065006D006F006A00690020D83DDE020020

1 Ответ

0 голосов
/ 18 апреля 2019

Мне удалось заставить его работать таким образом

echo utf16HexToUtf8("005400680069007300200069007300200061002000740065007300740020007700690074006800200061006E00200065006D006F006A00690020D83DDE020020");

function utf16HexToUtf8($data){
    return preg_replace_callback('/(d[89ab][0-9a-f]{2})(d[c-f][0-9a-f]{2})|([0-9a-fA-F]{4})/i', function ($matches) {
        return mb_convert_encoding( hex2bin($matches[0]), 'UTF-8', 'UTF-16');
    }, $data);
}

Выход:

This is a test with an emoji ?

Он преобразует ее из большой длинной строки HEX в двоичную, а затем преобразует ее в UTF-8 из UTF-16

Согласно исходному примеру / вопросу, его необходимо преобразовать в строку HEX из текущего массива целых UTF-16

...