在字符串末尾加上破折号不允许json_encode


Having en-dash at the end of the string doesn't allow json_encode

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

第n个字符是破折号。所以当我在记事本中查看它时,我得到最后一个字符为€。在我的编辑器,括号,我甚至不能打开日志文件,因为它只支持UTF-8编码。

我也不能在这个字符串上运行json_encode。

然而,当我使用substr($originalText,0,251)时,它工作得很好。我可以打开日志文件,它显示一个破折号而不是€。Json_encode也可以正常工作。

我可以使用mb_convert_encoding($mystring, "UTF-8", "Windows-1252")来规避这个问题,但是有没有人能告诉我为什么在末尾有这些字符会导致错误?此外,在这样做时,我的日志文件在括号中显示了€,这也令人困惑。

我的问题是为什么在字符串的末尾有一个破折号,而不是在其他任何地方(后面跟着其他字符)。

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

谢谢。

Pid的答案给出了为什么会发生这种情况的解释,这个答案只是看看你能做些什么…

<标题>使用mb_substr ()

multibyte string模块正是为这种情况而设计的,它提供了许多正确处理多字节字符的字符串函数。我建议你浏览一下,因为在你的应用程序的其他地方可能还需要其他的。

你可能需要安装或启用这个模块,如果你得到一个功能未找到错误。此操作的说明依赖于平台,超出了此问题的范围。

您想要的函数在您的问题的情况下被称为mb_substr()和调用相同,您将使用substr(),但有其他可选参数。

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

单个UTF-8字符可以被编码为1、2、3或4个字节,具体取决于字符。

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

[<-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.

所以解码器有第一个字节,但不能读取整个字符,因为字符串提前结束。

这会导致你所看到的所有效果。

这个问题的解决办法在Dezza的回答中。