Строка со смайликом выглядит допустимой в кодировке UTF-8, но iconv не может ее обработать

У меня есть следующий код, который пытается закодировать строку UTF-8 в UCS-2LE. Строка кажется допустимой, что можно проверить с помощью mb_check_encoding, однако, когда я запускаю для нее iconv, я получаю следующее уведомление:

Примечание: iconv(): обнаружен недопустимый символ во входной строке.

Есть идеи, в чем проблема?

<?php

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

$string = 'Voiture ????';
$isValidUTF8 = mb_check_encoding($string, 'UTF-8');
echo 'Is valid UTF-8: ' . ($isValidUTF8 ? 'Yes' : 'No') . "\n";

$text1 = iconv('UTF-8', 'UCS-2LE', $string);
var_dump($text1);

Вывод:

Действует UTF-8: Да

Примечание: iconv(): обнаружен недопустимый символ во входной строке.

логический (ложный)


person laurent    schedule 08.06.2017    source источник
comment
Попробуйте игнорировать параметр. Дайте мне знать, если вы получите какое-либо другое решение   -  person mujuonly    schedule 09.06.2017
comment
Я знаю об опции игнорирования, но я бы предпочел найти способ конвертировать, если это можно сделать   -  person laurent    schedule 09.06.2017


Ответы (1)


Проблема в том, что ???? не является допустимым символом UCS-2LE. Вы можете попробовать добавить \TRANSLIT или \IGNORE к выходной кодировке.

Использование TRANSLIT должно заменять несуществующие символы на аналогичные, а IGNORE удаляет их из выходной строки.

Вы можете сделать это так, но это не проверено, и я не уверен, работает ли это с UCS-2LE.

$text1 = iconv('UTF-8', 'UCS-2LE\\IGNORE', $string);
// or
$text1 = iconv('UTF-8', 'UCS-2LE\\TRANSLIT', $string);

Если вам нужна поддержка эмодзи, вам следует подумать о кодировке UTF-8.

person Philipp    schedule 08.06.2017
comment
Это не имеет смысла для меня. Конечно, входные символы не являются допустимыми ucs-2cs, так как они utf-8, а точка iconv состоит в том, чтобы преобразовать строку в другую. В этом случае ввод является допустимым utf-8, по крайней мере, в соответствии с предыдущей проверкой. - person laurent; 09.06.2017
comment
@this.lau_, поскольку вашего смайлика нет в таблице символов UCS-2LE, вы просто не можете преобразовать его в UCS-2LE. - person Philipp; 09.06.2017