У меня есть файл данных (точнее, \U00e8
Apple), который имеет \U00e8
Unicode, такие как \U00e8
и \U2019
. Мне нужно превратить их в действительные шестнадцатеричные объекты HTML, используя PHP.
То, что я сейчас делаю, это длинная строка:
$fileContents = str_replace("\U00e8", "è", $fileContents); $fileContents = str_replace("\U2019", "’", $fileContents);
Который явно ужасен. Я мог бы использовать регулярное выражение для преобразования \U
и всех конечных 0s
в &#x
, а затем придерживаться конечного ;
, но это также кажется тяжелым.
Есть ли простой, простой способ взять строку и заменить все юникодовые кодовые точки на объекты HTML?
Вы можете использовать preg_replace
:
preg_replace('/\\\\U0*([0-9a-fA-F]{1,5})/', '&#x\1;', $fileContents);
Тестирование RE:
PS> 'some \U00e8 string with \U2019 embedded Unicode' -replace '\\U0*([0-9a-f]{1,5})','&#x$1;' some è string with ’ embedded Unicode
Вот правильный ответ, который касается того факта, что это единицы кода, а не кодовые точки, и позволяет добавлять ненужные символы.
function unenc_utf16_code_units($string) { /* go for possible surrogate pairs first */ $string = preg_replace_callback( '/\\\\U(D[89ab][0-9a-f]{2})\\\\U(D[cf][0-9a-f]{2})/i', function ($matches) { $hi_surr = hexdec($matches[1]); $lo_surr = hexdec($matches[2]); $scalar = (0x10000 + (($hi_surr & 0x3FF) << 10) | ($lo_surr & 0x3FF)); return "&#x" . dechex($scalar) . ";"; }, $string); /* now the rest */ $string = preg_replace_callback('/\\\\U([0-9a-f]{4})/i', function ($matches) { //just to remove leading zeros return "&#x" . dechex(hexdec($matches[1])) . ";"; }, $string); return $string; }