在Kannel中发送阿拉伯短信

3
我正在尝试从Kannel发送阿拉伯短信(或法语短信),但客户端收到的结果并不完美(有时会出现阿拉伯文字“??????”)。
经过分析,我发现编码错误发生在我的bearbox和smsbox之间。我已经在发送短信的http请求中使用了“charset=utf-8&coding=2”,但是仍然存在同样的问题。
有人知道问题所在或者有更好的解决方案吗?
以下是我用于发送短信的代码:
StringBuffer param = new StringBuffer()
       param.append("http://localhost:1025/cgi-bin/sendsms?")
       param.append(URLEncoder.encode("username","UTF-8")).append("=").append(URLEncoder.encode("xxx","UTF-8"))
       param.append("&").append(URLEncoder.encode("password","UTF-8")).append("=").append(URLEncoder.encode("xxxx","UTF-8"))
       param.append("&").append(URLEncoder.encode("to","UTF-8")).append("=").append(URLEncoder.encode(numTel,"UTF-8"));
       param.append("&").append(URLEncoder.encode("charset","UTF-8")).append("=").append(URLEncoder.encode("utf-8","UTF-8"))

       param.append("&").append(URLEncoder.encode("coding","UTF-8")).append("=").append(URLEncoder.encode("2","UTF-8"))
       param.append("&").append(URLEncoder.encode("text","UTF-8")).append("=").append(URLEncoder.encode(text,"UTF-8"))
       param.append("&").append(URLEncoder.encode("priority","UTF-8")).append("=").append(URLEncoder.encode(""+priority,"UTF-8"))
       param.append("&").append(URLEncoder.encode("dlr-mask","UTF-8")).append("=").append(URLEncoder.encode("31","UTF-8"))
       param.append("&").append(URLEncoder.encode("dlr-url","UTF-8")).append("=").append(URLEncoder.encode(urlString,"UTF-8"))
       try{
           URL url = new URL(param.toString())
           System.out.println("INFO : Opening connection ")
           HttpURLConnection urlconnection = (HttpURLConnection) url.openConnection()
           System.out.println("INFO : Connection openned")
           BufferedReader input = new BufferedReader( new InputStreamReader(urlconnection.getInputStream()))
           String inputLine

           while ((inputLine = input.readLine()) != null)
               aResult.append(inputLine)
           input.close()
       }catch(Exception e){
           e.printStackTrace()
           return false
       }

       System.out.println("response : "+aResult.toString())
       System.out.println("INFO : all sent disconnect.")
'

感谢您。

你是如何发起HTTP请求的? - Carlo
请检查我添加的代码的帖子。 - Saad Touhbi
如果您打印param.toString(),您是否能看到预期的阿拉伯文本? - Carlo
不。文本都被编码了,除了英语单词。这是不是意味着我的HTTP请求出了问题?因为当我查看SMSBox控制台时,我看到了预期的文本,但当我转到BearBox控制台时,它变得混乱了。 - Saad Touhbi
非常感谢您的帮助 :) 我已经能够发送阿拉伯语/法语短信而不需要做任何更改。我在我的httpr请求中将文本编码为utf-8,并且在GET中不发送“charset”参数,只发送encoding=2,它就可以工作了!我不知道为什么,但它确实可以工作:P 如果您有任何想法,将不胜感激 :) - Saad Touhbi
显示剩余6条评论
3个回答

4
我能够使用此HTTP请求示例发送阿拉伯语/法语短信:
StringBuffer param = new StringBuffer()
       param.append("http://localhost:1025/cgi-bin/sendsms?")
       param.append(URLEncoder.encode("username","UTF-8")).append("=").append(URLEncoder.encode("xxx","UTF-8"))
       param.append("&").append(URLEncoder.encode("password","UTF-8")).append("=").append(URLEncoder.encode("xxxx","UTF-8"))
       param.append("&").append(URLEncoder.encode("to","UTF-8")).append("=").append(URLEncoder.encode(numTel,"UTF-8"));

       param.append("&").append(URLEncoder.encode("coding","UTF-8")).append("=").append(URLEncoder.encode("2","UTF-8"))
       param.append("&").append(URLEncoder.encode("text","UTF-8")).append("=").append(URLEncoder.encode(text,"UTF-8"))
       param.append("&").append(URLEncoder.encode("priority","UTF-8")).append("=").append(URLEncoder.encode(""+priority,"UTF-8"))
       param.append("&").append(URLEncoder.encode("dlr-mask","UTF-8")).append("=").append(URLEncoder.encode("31","UTF-8"))
       param.append("&").append(URLEncoder.encode("dlr-url","UTF-8")).append("=").append(URLEncoder.encode(urlString,"UTF-8"))
       try{
           URL url = new URL(param.toString())
           System.out.println("INFO : Opening connection ")
           HttpURLConnection urlconnection = (HttpURLConnection) url.openConnection()
           System.out.println("INFO : Connection openned")
           BufferedReader input = new BufferedReader( new InputStreamReader(urlconnection.getInputStream()))
           String inputLine

           while ((inputLine = input.readLine()) != null)
               aResult.append(inputLine)
           input.close()
       }catch(Exception e){
           e.printStackTrace()
           return false
       }

       System.out.println("response : "+aResult.toString())
       System.out.println("INFO : all sent disconnect.")

我在请求中没有发送“charset”参数,只发送了编码参数


0

我已经做了一些研究,我相信如果您指定coding=2,Kannel会期望消息体以UTF-16编码,至少如果我正确理解了这个讨论
另外,您应该查看一下文档


我尝试在发送文本之前将其编码为UTF-16,并指定“coding=2”,但解码错误,这意味着我正在使用的Kannel版本实际上期望一个UTF-8编码的文本(顺便说一下,我正在使用Kannel 1.4.3),因此如果我们迁移到另一个Kannel版本,我会记住你说的话...谢谢你的帮助。 - Saad Touhbi

0
您只需要按照以下步骤操作(kannel版本1.5): 1- 在kannel配置中的smsc组下添加alt-charset="UTF-8" 2- 当发送短信“مرحبا”时,您需要在sendsms命令中输入以下内容:text=مرحبا&charset=UTF-8&coding=1
请使用mysql命令检查您的数据库,因为像webmin这样的数据库管理工具可能无法识别阿拉伯字母。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接