在字符串末尾使用破折号不允许 json_encode
Having en-dash at the end of the string doesn't allow json_encode
我正在尝试使用以下方法从字符串中提取 n 个字符
substr($originalText,0,250)
;
第 n 个字符是破折号。所以当我在记事本中查看它时,我得到最后一个字符作为€。在我的编辑器 Brackets 中,我什至无法打开它的日志文件,因为它只支持 UTF-8 编码。
我也不能 运行 json_encode 这个字符串。
但是,当我使用 substr($originalText,0,251)
时,它工作得很好。我可以打开日志文件,它显示一个破折号而不是 €。 json_encode 也可以正常工作。
我可以使用mb_convert_encoding($mystring, "UTF-8", "Windows-1252")
来规避这个问题,但是谁能告诉我为什么最后这些字符特别会导致错误?
此外,在执行此操作时,我的日志文件显示在括号中,这也令人困惑。
我的问题是为什么在字符串的末尾有破折号,这与在其他任何地方(后面跟着其他字符)不同。
希望我的问题很清楚,如果没有我可以尝试进一步解释。
谢谢。
解释了为什么会发生这种情况,这个答案只是看看你能做些什么......
使用mb_substr()
multibyte string 模块正是为这种情况而设计的,它提供了许多正确处理多字节字符的字符串函数。我建议您仔细查看一下,因为在您的应用程序的其他地方可能还需要其他的。
如果出现函数未找到错误,您可能需要安装或启用此模块。对此的说明依赖于平台并且超出了这个问题的范围。
您问题中的案例所需的函数称为 mb_substr()
,其名称与您使用的 substr()
相同,但具有其他可选参数。
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.
所以解码器有第一个字节,但不能读取整个字符,因为字符串提前结束。
这会导致您看到的所有影响。
这个问题的解决方案是。
我正在尝试使用以下方法从字符串中提取 n 个字符
substr($originalText,0,250)
;
第 n 个字符是破折号。所以当我在记事本中查看它时,我得到最后一个字符作为€。在我的编辑器 Brackets 中,我什至无法打开它的日志文件,因为它只支持 UTF-8 编码。
我也不能 运行 json_encode 这个字符串。
但是,当我使用 substr($originalText,0,251)
时,它工作得很好。我可以打开日志文件,它显示一个破折号而不是 €。 json_encode 也可以正常工作。
我可以使用mb_convert_encoding($mystring, "UTF-8", "Windows-1252")
来规避这个问题,但是谁能告诉我为什么最后这些字符特别会导致错误?
此外,在执行此操作时,我的日志文件显示在括号中,这也令人困惑。
我的问题是为什么在字符串的末尾有破折号,这与在其他任何地方(后面跟着其他字符)不同。
希望我的问题很清楚,如果没有我可以尝试进一步解释。
谢谢。
使用mb_substr()
multibyte string 模块正是为这种情况而设计的,它提供了许多正确处理多字节字符的字符串函数。我建议您仔细查看一下,因为在您的应用程序的其他地方可能还需要其他的。
如果出现函数未找到错误,您可能需要安装或启用此模块。对此的说明依赖于平台并且超出了这个问题的范围。
您问题中的案例所需的函数称为 mb_substr()
,其名称与您使用的 substr()
相同,但具有其他可选参数。
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.
所以解码器有第一个字节,但不能读取整个字符,因为字符串提前结束。
这会导致您看到的所有影响。
这个问题的解决方案是