2010-11-15 91 views
1

在我的應用程序中有阿拉伯語和英語兩種語言的支持,但是當手機接收到阿拉伯短信時,我面臨一個問題,它被替換爲??? ???? (問號)知道我用於測試的monbile支持阿拉伯語和應用程序中的所有阿拉伯語正常工作正常,問題是隻有當我的手機收到阿拉伯短信時。在手機上發送阿拉伯短信在java中

String ff = new String(smsContent.getBytes("UTF-8"), "UTF-8"); 
      StringWriter stringBuffer = new StringWriter(); 
      PrintWriter pOut = new PrintWriter(stringBuffer); 
      pOut.print("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); 
     pOut.print("<!DOCTYPE MESSAGE SYSTEM \"http://127.0.0.1/psms/dtd/messagev12.dtd\" >"); 
     pOut.print("<MESSAGE VER=\"1.2\"><USER USERNAME=\""+userName+"\" PASSWORD=\""+password+"\"/>"); 
     pOut.print("<SMS UDH=\"0\" CODING=\"1\" TEXT=\""+ff+"\" PROPERTY=\"0\" ID=\"2\">"); 
     pOut.print("<ADDRESS FROM=\""+fromNo+"\" TO=\""+toNO+"\" SEQ=\"1\" TAG=\"\" />"); 
     pOut.print("</SMS>"); 
     pOut.print("</MESSAGE>"); 

     pOut.flush(); 
     pOut.close(); 


URL url = new URL("url"); 

     HttpURLConnection connection = (HttpURLConnection)url.openConnection(); 
     connection.setDoOutput(true); 

     BufferedWriter out = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream())); 

     out.write("data="+message+"&action=send"); 
     out.flush(); 

短信在我的應用程序的英文工作文件。

+0

你怎麼發短信,代碼可以幫助我們 – 2010-11-15 12:47:39

+0

如果發送UTF數據服務器嘗試打印存在,以確保它在UTF8真正達到有還,嘗試調試像這樣 – 2010-11-15 12:58:31

回答

2

首先,new String(smsContent.getBytes("UTF-8"), "UTF-8")是冗餘往返,相當於smsContent。首先,您通過UTF-8將字符串編碼爲字節,然後立即再次從字節中解碼出來。第二,你一起迷惑XML的方法是完全破碎的。你不能只是連接字符串,並希望最終形成格式良好的XML。例如想想如果有人試圖發送"會發生什麼?使用XML庫。第三,您隱式地使用OutputStreamWriter的平臺默認編碼,而不是明確指定一個,這意味着您的代碼僅適用於那些隨機出現默認編碼的機器。我猜你的不會。第四,你一起迷惑POST參數的方法被打破了。您尚未指定變量message。我猜這是完整的XML文檔,但是你試圖將它作爲POST參數發送給某種HTTP服務,在這種情況下,它需要進行轉義/ url編碼。舉個例子,如果有人試圖發送消息&data=<whatever>&會發生什麼?請澄清。

參見Using java.net.URLConnection to fire and handle HTTP requests

第五,由於你發送一些HTTP服務,有可能是一些文檔,該服務發送或如何指定它,可能帶有HTTP標頭是什麼編碼(可能是「Content-type: application/x-www-form-urlencoded; charset=UTF-8」 ?)。如果你自己弄不明白,請將我們指向文檔。

編輯:找到的文檔:http://www.google.se/search?q=valuefirst+pace

它相當清楚地指出,你需要URL編碼XML文檔,所以這是你缺少大概是什麼,在這種情況下,爲OutputStreamWriter的編碼都不會有問題只要它是ASCII兼容的。

然而,文檔沒有指定要用於URL編碼,這是非常弱的字符編碼。 UTF-8是最有可能的。

+0

感謝您的指導,我研究了你的鏈接,並得到了答案 – chetan 2010-11-18 07:32:14

1

從我在某些網頁上看到的短信阿拉伯語(和其他人)編碼與UCS-2而不是UTF-8。改變編碼值得一試。

+0

Unicode的短信確實是UCS-2 – ptomli 2010-11-15 13:14:58

+0

它會拋出一個異常 - java.io.UnsupportedEncodingException – chetan 2010-11-15 13:26:37

+0

@chetan - 嘗試UTF-16,它相當於第一個65535倍的值。 – 2010-11-15 13:49:10

1

您正在使用您的平臺的默認編碼請求數據,這可能與UTF-8很不相同。嘗試在使用OutputStreamWriter指定UTF-8:

... new OutputStreamWriter(connection.getOutputStream(), "UTF-8") ...

另一個問題當然是你的手工製作的XML文檔會盡快您的任何參數包含字符,其中有失敗的以XML格式轉義,但這是一個不同的故事。爲什麼不使用XML庫呢?


只是一個額外的信息:文檔克里斯托弗指向也說明您正在使用要求的例子是隻適合在手機短信的標準字符集短信。對於Unicode字符支持,您必須使用不同的請求。

+0

我已經通過將UTF-8,在這裏你指定 – chetan 2010-11-15 13:29:20

+0

測試,但我面臨同樣的問題 – chetan 2010-11-15 13:29:37

+0

感謝您的指導,我研究了API持有人的文件,並得到了答案 – chetan 2010-11-18 07:31:36