php - 字符串上的 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" 。
解决方案
正如@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 空白字符!
推荐阅读
- docker - docker 中 nginx 后面的 Keycloak 导致 404 和不定式重定向
- elasticsearch - 如何使用 Postman 和 ElasticSearch 向请求正文添加过滤器?
- ios - 无法使用 safari 打开某些网站
- c# - 如何模拟嵌套接口?
- javascript - vis.js 库 - 使用 svg 和自定义 html 渲染节点网络
- javascript - 使用 node.js 管理多个 Websocket 客户端连接
- jquery - Turbolinks-5 返回访问其他页面的页面后未重新加载 Javascript 代码
- r - 在估算的数据框中包含 ID 变量
- python - Plotnine:绘制图形时如何删除 ggplot:(xxx) 类型烦人的文本输出
- heroku - 桌面 Neo4j 错误:无法在数字“0”上创建属性“传输类”