
PHP读取SMS文件防乱码需先用file_get_contents读原始字节再用mb_convert_encoding显式转码如GBK→UTF-8并ltrim去除UTF-8 BOMCSV解析须指定enclosure和escape参数配合stream_set_encoding确保编码一致。PHP读取SMS数据文件时怎么避免乱码直接用fopen()读取短信导出文件比如 .txt、.csv大概率出现中文乱码根源是编码不匹配。手机导出的SMS文本常见 GBK、GB2312 或 UTF-8 BOM而 PHP 默认按 UTF-8 解析无BOM内容遇到 GBK 就会崩。先用mb_detect_encoding()粗略判断但不准别依赖它做自动转换更可靠的是用file_get_contents()读原始字节再用mb_convert_encoding($content, UTF-8, GBK)显式转——前提是知道源头编码查导出工具文档或用file -i filename.txt命令看如果文件带 UTF-8 BOM开头三个字节记得用ltrim($content, )去掉否则json_decode()或explode()可能静默失败解析SMS CSV格式要注意字段分隔和换行嵌套安卓短信导出的 CSV 经常把短信正文里的换行、逗号、双引号全保留标准fgetcsv()默认不处理跨行字段一读就错位。必须传入第四个参数escape且设为\或空字符串PHP 8.1 推荐否则反斜杠转义会出问题调用时显式指定 enclosure 为双引号并确保$handle fopen($file, r)后立即用stream_set_encoding($handle, UTF-8)同步编码示例安全读法复制AI写代码$handlefopen(sms.csv,r);stream_set_encoding($handle,UTF-8);while(($rowfgetcsv($handle, 0,,,,)) ! false) {$phone$row[0] ??;$body$row[2] ??;}写入SMS数据到MySQL要防SQL注入和时间格式错乱把解析后的短信存进数据库最常踩的坑不是逻辑而是datetime字段写入失败或时区偏移——手机导出的时间戳多为本地时间如 2024-03-15 14:22:05没带时区信息。别用date(Y-m-d H:i:s)直接拼字符串插库改用new DateTime($raw_time)实例化后再调format(Y-m-d H:i:s)它会按当前date_default_timezone_set()解析插入前务必用mysqli_real_escape_string()或预处理语句——body字段含单引号、 、emoji 时裸字符串拼接必炸如果原始时间是“13:22:05”但没日期得补上当天日期再构造DateTime否则变成 1970 年用PHP发送SMS回执需要校验手机号和内容长度处理完读取和存储下一步常是自动回复比如关键词触发。这时curl调用短信网关 API 前必须拦截两类硬伤。手机号格式用preg_match(/^1[3-9]d{9}$/, $phone)过滤去掉空格、短横、括号国际号另说但国内场景别信用户输入短信内容超长中文按 70 字符/条计含签名超过就得拆。用mb_strlen($text, UTF-8)算真实长度别用strlen()签名必须前置且加【】比如【我的APP】您好漏掉或格式错运营商直接拒收实际跑通这四步核心链路就算稳了。真正麻烦的是边缘情况比如某品牌手机导出的 CSV 用制表符分隔、某国产ROM把短信时间存成毫秒时间戳、或者 emoji 占两个 UTF-16 码位导致长度计算偏差——这些没法靠通用方案覆盖得留日志、抓原始样本、逐个对齐。来源于:ruhtkv/445910024681.md at main · moorestephen8432/ruhtkv · GitHub