动态Unicode消息显示乱码及Clickatell API调用错误求助
解决Clickatell API发送含撇号消息乱码及Unicode参数报错问题
问题根源
- 乱码是因为消息文本编码和API要求不匹配,你之前的请求还犯了个低级错误:把
Car放在了URL参数外面,导致text参数内容不完整。 - 用
unicode=1时报错116,是因为没按要求把文本转成UTF-16BE格式的十六进制字符串,直接写2019属于无效格式。
两种可行解决方案
方案一:直接用UTF-8 URL编码(无需unicode参数)
这是最简单的处理方式,步骤如下:
- 动态生成消息时,先把完整文本(比如
Swifty’s Car)转换成UTF-8编码,再对UTF-8字节做URL编码(把特殊字符转成%XX格式)。 - 正确的
text参数值应为:Swifty%E2%80%99s%20Car(撇号转成%E2%80%99,空格转成%20)。 - 完整请求示例(替换XXX为你的真实参数):
https://api.clickatell.com/http/sendmsg?user=XXX&password=XXX&api_id=XXX&to=XXX&text=Swifty%E2%80%99s%20Car - 注意:必须确保整个消息内容都包含在
text=后面,不能像之前那样把Car丢在URL参数外。
方案二:使用unicode=1参数(需UTF-16BE十六进制)
如果必须用Unicode模式,要严格遵循API规则处理:
- 动态生成文本后,先把文本转换成**UTF-16大端序(BE)**编码,再将字节转换成无分隔符的十六进制字符串。
- 比如
Swifty’s Car转成UTF-16BE的十六进制为:005300770069006600740079201900730020004300610072。 - 把这个十六进制字符串作为
text参数的值,同时追加&unicode=1。 - 完整请求示例:
https://api.clickatell.com/http/sendmsg?user=XXX&password=XXX&api_id=XXX&to=XXX&text=005300770069006600740079201900730020004300610072&unicode=1 - 这样就不会触发116错误,接收方也能正确显示撇号。
关键注意事项
- 动态生成请求时,一定要用代码自动处理编码:比如用Python的
urllib.parse.quote()、Java的URLEncoder.encode()这类工具函数处理UTF-8文本,或用对应语言的Unicode工具类生成UTF-16BE的十六进制字符串,绝对不要手动拼接编码内容。 - 所有参数必须完整包含在URL的参数部分,不能拆分内容。
内容的提问来源于stack exchange,提问作者Vvikas Gupta
相关产品推荐
相关产品推荐

