如何检查字符串是否可以安全地转换为另一个字符集而不会丢失?

时间:2012-08-24 21:35:32

标签: php character-encoding iconv mbstring

在将字符串从字符集转换为另一个字符串之前,是否有可能知道此转换是否无损?

例如,如果我尝试将UTF-8字符串转换为latin1,则无法转换的字符将替换为?。检查结果字符串中的?以确定转换是否无损是显然不是一种选择。

我现在能看到的唯一解决方案是转换回原来的字符集,并与原始字符串进行比较:

function canBeSafelyConverted($string, $fromEncoding, $toEncoding)
{
    $encoded = mb_convert_encoding($string, $toEncoding, $fromEncoding);
    $decoded = mb_convert_encoding($encoded, $fromEncoding, $toEncoding);

    return $decoded == $string;
}

这只是一个快速而又肮脏的问题,有时可能会出现意外行为,我想可能会有一种更清晰的方式来执行mbstringiconv或其他任何操作库。

1 个答案:

答案 0 :(得分:0)

另一种方法是使用set_error_handler()设置自己的错误处理程序。如果你在字符串上使用iconv(),它会抛出一个通知,如果它无法完全转换,你可以抓住它并在你的代码中做出反应。

或者您可以只计算编码前后的问号数量。或者使用// IGNORE调用iconv()并计算字符数。

没有一个比你更优雅的建议,但摆脱了双重处理。