【问题标题】:How to check if a string can safely be converted in another character set without loss?如何检查字符串是否可以安全地转换为另一个字符集而不会丢失?
【发布时间】:2012-08-20 11:09:05
【问题描述】:

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

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

【问题讨论】:

  • 你试过检查字符串大小mb_strlen吗?
  • 这将失败:如果将单个字符转换为?,则长度将相等,至少对于 mbstring。如果您的想法只是删除了不可转换的字符,那它会很有趣。
  • 他的例子比较了两个字符串,而不是字符串的长度。当其中一个包含问号而另一个包含另一个字符时,字符串将不相等。

标签: php character-encoding iconv mbstring


【解决方案1】:

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

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

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

【讨论】:

  • 有趣的想法,感谢分享。我很惊讶这不仅仅是 API 的一部分!
猜你喜欢
  • 2014-12-21
  • 2012-08-16
  • 1970-01-01
  • 2010-10-13
  • 2022-03-31
  • 1970-01-01
  • 2013-05-12
相关资源
最近更新 更多