首页 > 解决方案 > 字符串上的 trim("\u{200d}") 后出现“1366 字符串值不正确”

问题描述

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

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

以上确保字符串正确。但是现在我无法将它插入到 sql 数据库中。我收到此错误:

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

该字段设置为 varchar。据我了解,修剪应该只是修剪这些字符,是不是添加了其他导致这种情况的东西?

编辑:我最初遇到的问题是,当我在字符串中检查它时,其中一个字符串是这个 "e2808d20202020202020202020202020204c4c43" ,它显示了这个 "â LLC" 。

标签: php

解决方案


正如@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 空白字符!


推荐阅读