在字符串上修整(“ \ u {200d}”)后出现“ 1366错误的字符串值”

时间:2019-03-21 23:28:49

标签: php

我目前正在从api中提取一些数据。 我对数据没有任何控制权,但是在某些字符串上其他字符上有空格,而在其他字符串上则需要删除一些其他字符。我通过这样做解决了

trim($firstLineText, "\u{200d} \t\n\r\0\x0B")

以上内容确保字符串正确。但是现在我不能将其插入到sql数据库中。我收到此错误:

1366 Incorrect string value: '\x9CJD\xE2\x80\x9D' for column

该字段设置为varchar。根据我的理解,Trim应该只是修剪这些字符,是否添加了其他一些因素导致了这种情况?

编辑:我最初遇到的问题是字符串之一是 当我按字符串检查此“ e2808d20202020202020202020202020202020c4c4c43”时,它显示出此“âLLC”。

1 个答案:

答案 0 :(得分:3)

正如@mario在注释中正确指出的那样,trim仅适用于字节级别,而不适用于unicode字符。

unicode char“ \ u {200d}”扩展为三个字节:0xE2 0x80 0x8B

如此

trim($firstLineText, "\u{200d}")

可以读为

trim($firstLineText, "\xE2\x80\x8B")

这就是为什么您会得到损坏的UTF-8字符串的原因。

要解决此问题,您可以使用

preg_replace("/(^[\x{200d} \t\n\r\x0B]+|[\x{200d} \t\n\r\x0B]+$)/u", "", $str);

但是请注意,您可能要扩展列表,因为还有很多Unicode空格字符!