带有表情符号的字符串似乎是有效的UTF-8,但iconv无法处理它

时间:2017-06-08 22:20:37

标签: php utf-8 iconv ucs2

我有以下代码尝试将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():检测到输入字符串中的非法字符

     

布尔(假)

1 个答案:

答案 0 :(得分: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编码。