【问题标题】:Check string whether is UTF-8 or UCS-2检查字符串是 UTF-8 还是 UCS-2
【发布时间】:2012-01-19 18:10:54
【问题描述】:

如果我有数据列表:

$a = "hello";

$b= "4f60";

$c = "hi";

$d = "00480065006C006C006F";

$b 和 $d 是 UCS-2 字符串。 我希望在表格中显示所有这些数据,那么我如何知道哪些数据是 UCS-2 以便在显示之前进行转换?可能吗 ?我尝试了 mb_detect_encoding 和 preg_match 在 php.net 找到的 unicode,但即使它是一个未知符号,它仍然被认为是 unicode。

谢谢。

【问题讨论】:

    标签: php utf-8 ucs2


    【解决方案1】:

    首先,您显示的字符串是十六进制表示,而不是实际的 UCS-2 或 UTF-8 编码。

    也就是说,UCS-2UTF-8 之间存在一些相当大的差异,这将允许您编写能够以非常高的成功率正确检测编码的代码。但在此之前,请向我们展示您如何使用mb_detect_encoding,但它不起作用。重新发明一个比已经存在的更糟糕的轮子是没有意义的。

    更新:您的输入字符串实际上不是编码的字节值;它们是值的十六进制表示。要撤消此操作,您可以使用

    $proper_string = pack('H*', $hex_encoded_string);
    

    在此之后,mb_detect_encoding 应该可以正常工作了。

    【讨论】:

    • 感谢您的信息,我缺乏编码知识...老实说,我已经搜索并尝试了几个小时的许多方法,所以我真的不记得我是如何使用 mb_detect_encoding 的,但应该是像这样:mb_detect_encoding("4f60","UTF-8",true),或者只是mb_detect_encoding("4f60"),还有更多……
    • 非常感谢您的帮助。希望您不会介意再问一个问题。如果在 pack() 中失败,是否可以返回 false ?如果我 pack('H*',"hi") ,它会返回警告 (illegal hex digit) ,这样我就知道这条消息不需要转换,所以我只是尝试了一种方法 function packing($string) { if(pack('H*',$string)) { return true; } } ,但当然它不会工作...... .
    • @IreneLing:不,你不能无条件地使用它。你必须事先知道你正在使用什么样的字符串。
    • 我明白了,我想我得再想想其他方法了..非常感谢您的帮助。
    猜你喜欢
    • 2018-09-07
    • 2011-06-03
    • 1970-01-01
    • 2012-02-01
    • 2010-12-01
    • 2016-07-18
    • 2010-10-29
    • 2014-03-18
    • 1970-01-01
    相关资源
    最近更新 更多