4

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

例如,如果我尝试将 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或任何其他库来做到这一点。

4

1 回答 1

0

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

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

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

于 2012-08-24T22:02:52.053 回答