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

标签 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;
}

不过这只是一个快速而肮脏的方法,有时可能会出现意想不到的行为,我想可能有一种更简洁的方法来使用 mbstring 来做到这一点, iconv ,或任何其他库。

最佳答案

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

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

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

关于php - 如何检查字符串是否可以安全地转换为另一个字符集而不会丢失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12116968/

相关文章:

postgresql - postgres的COPY函数是否支持utf 16编码的文件?

php - 无法将外语字符插入数据库

php - 阿塞拜疆语 到 ASCII 音译

php - php中的FFMPEG返回段错误

javascript - 数据数组中带有 php 循环的谷歌图表不显示

php - 从一个主机移动到另一个主机后无法显示日语

c - 将当前区域设置编码中的一个宽字符从 stdin 回显到 stdout

svn - 如何检查提交给 SVN 的文件是否使用预提交 Hook 以 UTF-8 编码?

php - explode() 到 $key=>$value 对

php - 样式化的单选按钮(jquery?)