2012-03-27 227 views
0

我在iPhone應用程序中顯示一些阿拉伯文字時遇到了一些問題。當我在UILabel上顯示它時,它顯示爲?????? ????? ??????該字符串從服務器作爲XML來解析,並顯示在UILabel上。我不知道這是由於在iPhone或從服務器端的問題。阿拉伯字符問題

  • 我想知道如何確定來自服務器的字符串是否具有正確的編碼,並且是有效的阿拉伯字符。

  • 是否足夠打印每個字符的值並檢查它位於阿拉伯Unicode字符之間。 (就像字符A的ASCII值是65而Z的ASCII值是90.所以值70必須是ASCII字符)。

  • 在服務器中,字符串使用UTF8編碼進行編碼。和用C#編寫的服務器程序。什麼是寫阿拉伯文字從服務器到iPhone的編碼方法?

  • 我是否需要使用其他字體才能正確顯示阿拉伯字符。

  • 在互聯網中是否有任何帶有阿拉伯語內容的XML文件,從哪裏我可以正確解析和顯示阿拉伯文字?

在此先感謝..

編輯:

當我NSLogged XML數據我有同樣的???? ???? ???字符。

編輯

見我在控制檯有一個XML風格的數據。

<CB_SEC_COMP> 
<SC_COMP_ID>9999</SC_COMP_ID> 
<SCA_LONG_NAME>???? ????? ?????????? ????? ?????????</SCA_LONG_NAME> 
<SCE_LONG_NAME>CHINA SECURITY &amp; SURVEILLANCE TECHNOLOGY, INC.</SCE_LONG_NAME> 
<SCA_SHORT_NAME>???? ????? ?????????</SCA_SHORT_NAME> 
<SCE_SHORT_NAME>CHINA SECURITY &amp; SUR</SCE_SHORT_NAME> 
<SC_MRK_CODE>9</SC_MRK_CODE> 
<SC_SEC_CODE>86</SC_SEC_CODE> 
<SC_STATUS>Y</SC_STATUS> 
<TICKER_ID>CSR</TICKER_ID> 
<SC_MRK_TYPE_CODE>0001</SC_MRK_TYPE_CODE> 
<SC_EXCHANGE>DFM</SC_EXCHANGE> 
<CUR_CODE>AED</CUR_CODE> 
</CB_SEC_COMP> 
+0

您是否嘗試過設置斷點和調試代碼,看看它有XML字符串中什麼樣的價值,你解析它之前,你解析後,你將它添加到以前的UILabel?你做了哪些研究來確定可以在XML中傳遞哪些字符以及以何種編碼進行傳遞? – 2012-03-27 14:34:40

+0

你可以在你處理服務器響應的地方顯示你的iOS代碼嗎?這聽起來像它可能是在客戶端的編碼問題(因爲您確認您的服務器是UTF8編碼) – Clafou 2012-03-27 14:53:09

+0

我不知道的是,XML在UTF8編碼,它不具有頭部像<?XML版本=「1.0 「encoding =」UTF-8「?>。它只是有一些標籤和每個標籤的值。打印到控制檯時,我會發送一部分XML。 ???? ???? ?????? 房地產指數 90000000 ????? ??????? ?????? 公司名稱 rakeshNS 2012-03-28 12:20:28

回答

1

感謝所有的答案。問題不在iPhone端。在服務器中,XML未正確編碼爲UTF8字符串。當它正確編碼時,我得到了有效的阿拉伯字符。我只是做了這樣的代碼

NSString* lableText = [[NSString alloc] initWithData:serverSentData encoding: NSUTF8StringEncoding ]; 

爲NSData的轉換爲NSString的,效果不錯!

4

你應該發送和接收來自服務器的文本都在UTF-8!

從NSString.h:

enum { 
    NSASCIIStringEncoding = 1,  /* 0..127 only */ 
    ... 

    **NSUTF8StringEncoding = 4,** 
    ... 

    **NSUTF16StringEncoding = NSUnicodeStringEncoding,**  /* An alias for NSUnicodeStringEncoding */ 
    .... 
}; 
typedef NSUInteger NSStringEncoding; 

在iOS應用的代碼應該像如下:((NSData的*)serverSentData - 從服務器收到字符串的NSData的表示)

NSString* lableText = [[NSString alloc] initWithData:serverSentData encoding:NSUTF8StringEncoding ]; 

,如果它是UTF-16:

NSString* lableText = [[NSString alloc] initWithData:serverSentData encoding:NSUTF16StringEncoding ]; 

順便說一下,您可以使用json。當我發送cyrylic文本時它對我很好。

0

如果您的服務器在頭髮送編碼:

<?xml version="1.0" encoding="UTF-8" ?> 

則內置或任何其他寫得很好的XML解析器會處理並以正確的方式解碼PCDATA(標籤之間的文本) 。如果你的服務器沒有發送這個信息,並且你不能在服務器端改變它,那麼你必須猜測你自己使用了哪個編碼,並將結果手動轉換爲UTF-8。例如,如果你的字符串是純16位的Unicode,你可以這樣來做:

NSString *responseString = [[[NSString alloc] initWithData:responseData encoding:NSUnicodeStringEncoding] autorelease]; 
NSData* convertedData = [responseString dataUsingEncoding:NSUTF8StringEncoding]; 
+0

我沒有像<?xml version =「1.0」encoding =「UTF-8」?>那樣獲取標題。這是因爲,在服務器側上使用的方法DataSet.GetXML http://msdn.microsoft.com/en-us/library/system.data.dataset.getxml(v=vs.71).aspx,默認不會把<?xml version =「1.0」encoding =「UTF-8」?>。任何方式讓我檢查你已經將字符串轉換爲數據的方式。感謝您的關注。 – rakeshNS 2012-04-10 11:53:26