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


How to check if a string can safely be converted in another character set without loss?

在将字符串从一个字符集转换为另一个字符之前,是否可以知道这种转换是否是无损的?

例如,如果我尝试将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;
}

这只是一个快速&虽然是脏的,但有时可能会出现意想不到的行为,我想可能有一种更干净的方法可以用mbstring、iconv或任何其他库来做到这一点。

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

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

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