给定两个等长字符串,是否有一种优雅的方法来获得第一个不同字符的偏移量?
显而易见的解决方案是:
for ($offset = 0; $offset < $length; ++$offset) {
if ($str1[$offset] !== $str2[$offset]) {
return $offset;
}
}
Run Code Online (Sandbox Code Playgroud)
但对于这么简单的任务来说,这看起来并不合适.
我正在调用json_encode()来自带有utf8_general_ci整理的MySQL数据库的数据.问题是有些行有奇怪的数据,我无法清理.例如符号?,所以一旦到达json_encode(),它就失败了json_encode(): Invalid UTF-8 sequence in argument.
我试过utf8_encode()和utf8_decode(),甚至mb_check_encoding()但它一直打通,并造成混乱.
在Mac上运行PHP 5.3.10.所以问题是 - 我如何清理无效的utf8符号,保留其余数据,以便这样json_encoding()做?
更新.这是一种重现它的方法:
echo json_encode(pack("H*" ,'c32e'));
Run Code Online (Sandbox Code Playgroud) 我正在阅读数据库中的一些希伯来语文本并尝试使用json_encode它.如果print_r我得到的结果:
Array
(
[0] => Array
(
[value] => 88
[text] => ???? ?'
[parent_id] => 1
[level] => 1
)
[1] => Array
(
[value] => 89
[text] => ???? ?'
[parent_id] => 1
[level] => 1
)
[2] => Array
(
[value] => 91
[text] => ???? ?'
[parent_id] => 1
[level] => 1
)
)
Run Code Online (Sandbox Code Playgroud)
而json_encode显示:
[{"value":"88","text":null,"parent_id":"1","level":"1"},{"value":"89","text":null,"parent_id":"1","level":"1"},{"value":"91","text":null,"parent_id":"1","level":"1"}]
Run Code Online (Sandbox Code Playgroud)
我相信它是因为我的数据库中的文本包含一个(')标记.尝试过各种条带组合或者real_escape_string没有帮助.
我需要将MySQL查询的结果编码为JSON格式.
我的数据库是编码的utf8_unicode_ci.
特别是,我有一些特殊的字符(例如,€)存储在我的数据库中,当我应用PHP函数时它产生一个空值json_encode.
我怎样才能解决这个问题?
在的本机PHP 5实现中,我遇到了一种有趣的行为json_encode()。显然,当将对象序列化为json字符串时,编码器将使包含“卷曲”引号的字符串中的所有属性无效,该属性可能会在启用自动转换的情况下从MS Word文档中复制粘贴。
这是该功能的预期行为吗?我该怎么做才能迫使这些字符隐瞒它们的基本等同物?我已经检查了返回数据的数据库和插入的管理页面之间的字符编码不匹配,并且一切都正确设置了-看起来好像编码器由于这些字符而拒绝了这些值。还有其他人遇到过这种行为吗?
编辑:
澄清;
MSWord将采用标准的引号和撇号,并将其转换为更美观的“花式”或“卷曲”引号。当将这些字符放在内容管理器中时,这些字符的编辑界面(在html中)和数据库编码之间的字符集不匹配,这可能会引起问题。
不过,这不是问题所在。例如,我有一个代表人的个人资料和字符串的json_object:
Jim O’Shea
该撇号的UTF代码为 \u2019
从数据库中获取并直接进行json_encoded时,json对象中的结果将为null。
{"model_name":"Bio","logged":true,"BioID":"17","Name":null,"Body":"Profile stuff!","Image":"","Timestamp":"2011-09-23 11:15:24","CategoryID":"1"}