在字符串末尾加上短划线不允许json_encode

时间:2016-10-14 13:24:49

标签: php json utf-8 mb-convert-encoding

我正在尝试使用字符串从字符串中提取n个字符 substr($originalText,0,250);

第n个字符是一个短划线。所以当我在记事本中查看它时,我得到了最后一个字符。在我的编辑器Brackets中,我甚至无法打开日志文件,因为它只支持UTF-8编码。

我也无法在此字符串上运行json_encode。

但是,当我使用substr($originalText,0,251)时,它可以正常工作。我可以打开日志文件,它显示一个en-dash而不是'。 json_encode也可以。

我可以使用mb_convert_encoding($mystring, "UTF-8", "Windows-1252")来解决问题,但是有人可以告诉我为什么最后这些字符会导致错误吗? 此外,在执行此操作时,我的日志文件显示在括号中,这也令人困惑。

我的问题是为什么在字符串的末尾加上en-dash,不同于在其他任何地方使用它(后跟其他字符)。

希望我的问题很清楚,如果不是,我可以尝试进一步解释。

感谢。

2 个答案:

答案 0 :(得分:4)

Pid's answer解释了为什么会这样,这个答案只是看看你能做些什么......

使用mb_substr()

multibyte string模块专门针对这种情况而设计,并提供了许多正确处理多字节字符的字符串函数。我建议您查看一下,因为在您的应用程序的其他位置可能还需要其他的。

如果找不到函数错误,则可能需要安装或启用此模块。对此问题的说明取决于平台,并且超出了此问题的范围。

您在问题中对案例所需的函数称为mb_substr(),其调用与使用substr()的函数相同,但具有其他可选参数。

答案 1 :(得分:4)

UTF-8使用所谓的代理,它将代码页扩展到ASCII以外,以容纳更多字符。

单个UTF-8字符可以编码为一个,两个,三个或四个字节,具体取决于字符。

您在多字节字符的中间剪切字符串:

[<-character->]
[byte-0|byte-1]
       ^
      You cut the string right here in the middle!


[<-----character---->]
[byte-0|byte-1|byte-2]
       ^      ^
      Or anywhere here if it's 3 bytes long.

因此,解码器具有第一个字节,但无法读取整个字符,因为字符串过早结束。

这会导致您目睹的所有效果。

此问题的解决方案是here in Dezza's answer