字符串 trim("\u{200d}") 后出现 "1366 Incorrect string value" 错误

3

我目前正在从API中获取数据。 我无法控制数据,但在某些字符串上它有空格,在其他字符串上它有一些我需要移除的其他字符。我通过以下方式解决了这个问题:

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

以上代码确保了字符串是正确的。但现在我无法将其插入到SQL数据库中,我收到以下错误信息:
1366 Incorrect string value: '\x9CJD\xE2\x80\x9D' for column

该字段设置为 varchar 类型。根据我的理解,Trim 函数应该只是删除这些字符,它是否添加了其他内容导致现在出现了问题?

编辑:我最初的问题是其中一个字符串是 "e2808d20202020202020202020202020204c4c43",但在字符串中检查时显示为 "â LLC"。


显示原始字符串和修剪后的十六进制。 - zerkms
1
trim仅适用于字节。而\u{200d}解析为\xe2 \x80 \x8d,可能会破坏以下UTF-8编码。 - mario
当我在字符串中检查这个“e2808d20202020202020202020202020204c4c43”时,它显示为“â LLC”。我之前发布了这个问题,得到的答案是要修剪它,我没有意识到这会引起问题。@zerkms - FabricioG
1个回答

4

正如 @mario 在评论中正确指出的那样,trim 只在字节级别上工作,而不是 Unicode 字符。

Unicode 字符 "\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空格字符!


这只能在特定的情况下工作吗?我运行它时出现了这个错误:preg_replace():正则表达式中的空字节。@Kaii - FabricioG
@FabricioG 我没有测试过这个代码,只是复制了你的列表... 经过思考,空字节永远不会出现在你收到的字符串中,因此可以安全地从替换中删除它。(请参见更新) - Kaii
@FabricioG 抱歉,我忘记在正则表达式中启用 Unicode 模式 (/.../u),请查看更新。 - Kaii
不要再让它发生了... 哈哈,开玩笑的,谢谢你兄弟,你帮了我很多!@Kaii - FabricioG
实际上有没有办法只对字符串的开头和结尾进行操作?目前它会从字符串中的任何位置删除空格。这就是为什么我最初使用Trim的原因。抱歉,我没有说清楚。@Kaii - FabricioG
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接