最近在负责一个用户通知系统,其中一个核心功能就是通过短信发送各种提醒和验证码。起初,我们只是简单地使用
mb_strlen()来计算字符长度,但很快就发现问题重重。用户反馈短信内容被截断,或者一条短消息却被计费为多条。深入研究后才发现,短信的计费规则远比想象中复杂:
- 字符编码差异:GSM 7-bit编码支持的字符更多(如160个字符为一条),而包含中文、日文或特殊符号的短信则会切换到UTF-16编码,每条短信的字符数骤降(如70个字符为一条)。
- 特殊字符和表情符号:一些特殊字符和表情符号在UTF-16中可能占用不止一个字符位,这使得常规的字符计数方法失效。
- 分段规则:当短信内容超出单条限制时,会被自动分段发送,每段都会有额外的分段头,这会进一步减少每段实际可用的字符数。
面对这些挑战,我们尝试过自己编写复杂的逻辑来判断编码、计算长度,但代码量大、维护困难,而且总有遗漏的边缘情况。正当我们焦头烂额之际,发现了
instasent/sms-counter-php这个 Composer 库,它简直是为解决这类问题而生!
instasent/sms-counter-php
:你的短信计数专家
instasent/sms-counter-php是一个专门用于检测短信文本编码、根据编码计算字符数并提供短信分段信息的 PHP 类库。它能够智能地处理各种编码和特殊字符,为你提供精确的短信长度和分段详情。
1. 快速安装
使用 Composer 安装
instasent/sms-counter-php非常简单,只需一行命令:
composer require instasent/sms-counter-php
Composer 会自动处理依赖并下载库文件,让你的项目立即拥有强大的短信计数能力。
立即学习“PHP免费学习笔记(深入)”;
2. 基本用法:精确计数与分段
安装完成后,你就可以在代码中轻松使用它了。以下是一个基本示例:
count($text1);
echo "短信内容: \"{$text1}\"\n";
echo "计数结果:\n";
print_r($result1);
/*
输出类似:
stdClass Object
(
[encoding] => GSM_7BIT
[length] => 58
[per_message] => 160
[remaining] => 102
[messages] => 1
)
*/
echo "\n-----------------------------------\n\n";
// 示例2:包含中文,自动切换UTF-16编码
$text2 = '你好,世界!这是一条包含中文的测试短信。';
$result2 = $smsCounter->count($text2);
echo "短信内容: \"{$text2}\"\n";
echo "计数结果:\n";
print_r($result2);
/*
输出类似:
stdClass Object
(
[encoding] => UTF16
[length] => 21
[per_message] => 70
[remaining] => 49
[messages] => 1
)
*/
echo "\n-----------------------------------\n\n";
// 示例3:超长短信,自动分段
$text3 = '这是一条非常长的测试短信,用来演示短信分段的功能。在实际应用中,短信长度的精确计算对于控制成本和确保信息完整性至关重要。如果短信内容过长,它会被自动拆分成多条短信发送。';
$result3 = $smsCounter->count($text3);
echo "短信内容: \"{$text3}\"\n";
echo "计数结果:\n";
print_r($result3);
/*
输出类似:
stdClass Object
(
[encoding] => UTF16
[length] => 93
[per_message] => 67 // 注意:分段后每条的可用字符数会减少
[remaining] => 41
[messages] => 2
)
*/
echo "\n-----------------------------------\n\n";
// 示例4:包含表情符号(UTF16)
$text4 = '这是一条带表情的短信:???';
$result4 = $smsCounter->count($text4);
echo "短信内容: \"{$text4}\"\n";
echo "计数结果:\n";
print_r($result4);
/*
输出类似:
stdClass Object
(
[encoding] => UTF16
[length] => 15
[per_message] => 70
[remaining] => 55
[messages] => 1
)
*/
?>count()方法返回一个
stdClass对象,其中包含以下关键信息:
encoding
:检测到的短信编码(GSM_7BIT
或UTF16
)。length
:短信内容的实际字符长度。per_message
:单条短信的最大字符数(会根据编码和是否分段而变化)。remaining
:当前短信分段中剩余的字符数。messages
:短信将被拆分成的总条数。
3. 文本净化与特殊处理
instasent/sms-counter-php还提供了一些高级功能:
-
sanitizeToGSM()
:如果你需要确保短信内容严格符合GSM 03.38字符集,可以使用此方法将不支持的字符转换为其近似的ASCII字符或移除。例如sanitizeToGSM('dadáó')会返回dadao
。 -
countWithShiftTables()
:支持GSM 03.38第八版引入的国家语言转换表,可以更精确地处理土耳其语、西班牙语、葡萄牙语等特定语言的字符。
优势与实际应用效果
使用
instasent/sms-counter-php之后,我们系统中的短信发送模块得到了显著优化:
- 精确的成本控制:通过预先计算短信条数,我们能够准确预估发送成本,避免了不必要的开支。
- 提升用户体验:用户发送的短信不再因字符限制而被意外截断,保证了信息的完整性和可读性。
- 简化开发复杂度:我们不再需要维护复杂的字符计数逻辑,将精力投入到核心业务开发中。
- 强大的兼容性:自动处理多种编码和特殊字符,使得系统能够应对全球范围内的短信发送需求。
总而言之,如果你正在开发任何需要发送短信的PHP应用,并且对短信的字符计数和分段有精确要求,那么
instasent/sms-counter-php绝对是你的不二之选。它不仅能解决你遇到的实际问题,还能大大提升你的开发效率和代码质量。赶紧将它引入你的项目,让短信发送变得更智能、更可靠吧!










