2012-11-09 5 views
7

मैं एकता में एक परियोजना पर काम कर रहा हूं जो असेंबली सी # का उपयोग करता है। मैं विशेष चरित्र प्राप्त करने की कोशिश करता हूं, लेकिन कंसोल में यह सिर्फ एक खाली वर्ण प्रदर्शित करता है: ""। उदाहरण के लिए "आप कैसे हैं?" अनुवाद "कॉमो एस्टास" वापस लौटना चाहिए, लेकिन यह "सीएमओ एस्ट्स" लौटाता है। मैंने एक चरित्र सरणी में रिटर्न स्ट्रिंग "सीएमओ एस्ट्स" रखा और महसूस किया कि यह एक गैर-खाली खाली चरित्र है। मैं Encoding.UTF8 उपयोग कर रहा हूँ, और जब मैं कार्य करें:किसी चरित्र के डेटा को कैसे प्राप्त करें

char ch = '\u00e9'; 
print (ch); 

यह प्रिंट होगा "é"। मैं का उपयोग कर एक दिया स्ट्रिंग के बंद बाइट्स हो रही है की कोशिश की: "आप कैसे हैं"

byte[] utf8bytes = System.Text.Encoding.UTF8.GetBytes(temp); 

जबकि अनुवाद है, यह एक बाइट स्ट्रिंग वापस आ जाएगी, लेकिन इस तरह é विशेष वर्ण के लिए, मैं की श्रृंखला मिल बाइट्स 23 9, 1 9 1, 18 9, जो एक प्रतिस्थापन चरित्र है।

अक्षरों से पुनर्प्राप्त करने के लिए मुझे किस प्रकार की जानकारी की आवश्यकता है ताकि यह निर्धारित किया जा सके कि यह कौन सा चरित्र है? क्या मुझे ऐसी जानकारी के साथ कुछ करने की ज़रूरत है जो Google मुझे देता है, या यह कुछ और है? मुझे एक सामान्य मामले की आवश्यकता है जिसे मैं अपने कार्यक्रम में रख सकता हूं और किसी भी इनपुट स्ट्रिंग के लिए काम करूंगा। अगर कोई मदद करेगा तो इसे बहुत सराहाया जाएगा।

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using UnityEngine; 
using System.Collections; 
using System.Net; 
using HtmlAgilityPack; 


public class Dictionary{ 
string[] formatParams; 
HtmlDocument doc; 
string returnString; 
char[] letters; 
public char[] charString; 
public Dictionary(){ 
    formatParams = new string[2]; 
    doc = new HtmlDocument(); 
    returnString = ""; 
} 

public string Translate(String input, String languagePair, Encoding encoding) 
    { 
     formatParams[0]= input; 
     formatParams[1]= languagePair; 
     string url = String.Format("http://www.google.com/translate_t?hl=en&ie=UTF8&text={0}&langpair={1}", formatParams); 

     string result = String.Empty; 

     using (WebClient webClient = new WebClient()) 
     { 
      webClient.Encoding = encoding; 
      result = webClient.DownloadString(url); 
     }  
     doc.LoadHtml(result); 
     input = alter (input); 
     string temp = doc.DocumentNode.SelectSingleNode("//span[@title='"+input+"']").InnerText; 
     charString = temp.ToCharArray(); 
     return temp; 
    } 
// Use this for initialization 
void Start() { 

} 
string alter(string inputString){ 
    returnString = ""; 
    letters = inputString.ToCharArray(); 
    for(int i=0; i<inputString.Length;i++){ 
     if(letters[i]=='\''){ 
      returnString = returnString + "&#39;"; 
     }else{ 
      returnString = returnString + letters[i]; 
     } 
    } 
    return returnString; 
} 
} 
+0

आपको उस कोड को शामिल करना चाहिए जो प्रतिक्रिया उत्पन्न कर रहा है। –

+0

मुझे नहीं पता कि समस्या क्या है, ईमानदारी से। मैं आपके प्रश्न में जो देखता हूं वह यह है कि आप जो भी मांग रहे हैं वह आपको मिल रहा है। यदि आप यूटीएफ 8 बाइट्स के लिए पूछते हैं, तो आपको यूटीएफ 8 बाइट्स मिलेंगे। 23 9, 1 9 1, 18 9 आपके एकल यूनिकोड चरित्र के लिए यूटीएफ 8 एन्कोडिंग हैं। आप यूनिकोड को UTF8 से अनुवाद करने के लिए की जरूरत है, कि कार्य करें: http://stackoverflow.com/questions/11293994/how-to-convert-a-utf-8-string-into-unicode – plinth

+0

क्या आपके 'प्रिंट करता है() विधि क्या है? यदि आप अपने यूटीएफ 8 बाइट्स को पात्रों के रूप में पेश करने का प्रयास कर रहे हैं, तो आपको समस्याएं आ सकती हैं। यूटीएफ 8 वर्ण 1 बाइट से अधिक लंबे हो सकते हैं। –

उत्तर

0

तुम वास्तव में काफी पास है:

यहाँ कोड है कि संदर्भित किया जाता है। बस कोड किए गए अक्षर को \ u के साथ डालें और यह काम करता है।

string mystr = "C\u00f3mo Est\u00e1s?"; 
+0

धन्यवाद, लेकिन यह एक ही मामले के लिए है। मुझे एक सामान्य समाधान की आवश्यकता है। –

0

मैं GoogleTranslate API के बारे में ज्यादा पता नहीं है, लेकिन मेरा पहला विचार आप एक यूनिकोड सामान्यीकरण समस्या मिल गया है कि है।

System.String.Normalize() और उसके दोस्तों को देखें।

यूनिकोड बहुत जटिल है, इसलिए मैं सरल बनाउंगा! यूनिकोड में विभिन्न तरीकों से कई प्रतीकों का प्रतिनिधित्व किया जा सकता है, जो है: 'é' को 'é' (एक वर्ण), या 'ई' + 'उच्चारण चरित्र' (दो वर्ण) के रूप में, या जो आता है उसके आधार पर प्रदर्शित किया जा सकता है एपीआई से वापस, कुछ और पूरी तरह से।

सामान्यीकृत फ़ंक्शन आपकी स्ट्रिंग को एक ही पाठ के अर्थ में परिवर्तित कर देगा, लेकिन संभावित रूप से एक अलग बाइनरी मान जो आपकी आउटपुट समस्या को ठीक कर सकता है।

1

शायद आपको अन्य API/URL का उपयोग करना चाहिए।

public static string Translate(string input, string fromLanguage, string toLanguage) 
    { 
     using (WebClient webClient = new WebClient()) 
     { 
      string url = string.Format("http://translate.google.com/translate_a/t?client=j&text={0}&sl={1}&tl={2}", Uri.EscapeUriString(input), fromLanguage, toLanguage); 
      string result = webClient.DownloadString(url); 

      // I used JavaScriptSerializer but another JSON parser would work 
      JavaScriptSerializer serializer = new JavaScriptSerializer(); 
      Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(result); 
      Dictionary<string, object> sentences = (Dictionary<string, object>)((object[])dic["sentences"])[0]; 
      return (string)sentences["trans"]; 
     } 
    } 

अगर मैं एक कंसोल App में इस चलाएँ:: इस समारोह नीचे एक भिन्न यूआरएल कि JSON डेटा वापस आती है और बेहतर काम करने लगता है का उपयोग करता है यह प्रदर्शित करेगा

Console.WriteLine(Translate("How are you?", "en", "es")); 

¿Cómo estás? 
+0

इसे प्रोग्राम में डालने का प्रयास करते समय, यह कहता है कि इसमें नामस्थान गुम है। मैंने "System.web का उपयोग करके" कोशिश की; लेकिन यह अभी भी कहता है कि नामस्थान गुम है। इसे काम करने के लिए मुझे किस नामस्थान का उपयोग करना है? –

+0

आपको System.Web.Extensions –

+0

@CameronBarge में एक असेंबली संदर्भ जोड़ने की आवश्यकता है मैंने साइमन के पोस्ट में कुछ संपादन किए हैं (उन्हें सहकर्मी-समीक्षा की जा रही है ..), लेकिन सामान्य रूप से आपको 'System.Web शामिल करना होगा। एक्सटेंशन 'असेंबली (यानी "संदर्भ" में) और' System.Net' और 'System.Web.Script.Serialization' के लिए "उपयोग" है। – flindeberg

0

मुझे अपनी परियोजना में से एक काम करने में एक ही समस्या थी [भाषा संसाधन स्थानीयकरण अनुवाद]

मैं w एक ही काम करने के रूप में और उपयोग कर रहा था .. System.Text.Encoding.UTF8.GetBytes() और utf8 एन्कोडिंग के कारण परिणाम स्ट्रिंग में आपके जैसे 23 9, 1 9 1, 18 9 जैसे विशेष वर्ण प्राप्त हुए थे।

कृपया मेरे समाधान का एक नज़र डालें ...उम्मीद है कि इस मदद करता है

सभी गूगल अनुवाद में एन्कोडिंग का उपयोग करें नहीं है की तरह सही वापस आ जाएगी यह स्ट्रिंग में स्वयं के रूप में। [जो गूगल समर्थन हर भाषा में अनुवाद के लिए काम करता है] कुछ स्ट्रिंग परिवर्तन करते हैं और स्ट्रिंग पढ़ने के रूप में यह है ...

जेनेरिक समाधान

try 
{ 
    //Don't use UtF Encoding 
    // use default webclient encoding 

    var url = String.Format("http://www.google.com/translate_t?hl=en&text={0}&langpair={1}", "►" + txtNewResourceValue.Text.Trim() + "◄", "en|" + item.Text.Substring(0, 2));      

    var webClient = new WebClient(); 
    string result = webClient.DownloadString(url); //get all data from google translate in UTF8 coding.. 

     int start = result.IndexOf("id=result_box"); 
     int end = result.IndexOf("id=spell-place-holder"); 
     int length = end - start; 
     result = result.Substring(start, length); 
     result = reverseString(result); 

     start = result.IndexOf(";8669#&");//◄ 
     end = result.IndexOf(";8569#&"); //► 
     length = end - start; 

     result = result.Substring(start +7 , length - 8); 
     objDic2.Text = reverseString(result); 

     //hard code substring; finding the correct translation within the string. 
     dictList.Add(objDic2); 
} 
catch (Exception ex) 
{ 
    lblMessages.InnerHtml = "<strong>Google translate exception occured no resource saved..." + ex.Message + "</strong>"; 
       error = true; 
} 

public static string reverseString(string s) 
{ 
    char[] arr = s.ToCharArray(); 
    Array.Reverse(arr); 
    return new string(arr); 

} 

के रूप में आप कोड से देख सकते हैं कोई एन्कोडिंग कर दिया गया है प्रदर्शन किया और मैं Google से वापसी अनुवाद की शुरुआत और अंत निर्धारित करने के लिए "►" + txtNewResourceValue.Text.Trim() + "◄" के रूप में 2 विशेष कुंजी charachters भेज रहा हूँ।

इसके अलावा मैं जाँच की है hough मेरी भाषा उपयोगिता उपकरण मैं हो रही है "कोमो एस्तस?" जब को भेजना कैसे आप अनुवाद गूगल के लिए कर रहे ... :)

सादर [Shaz]

---------------------- ----- संपादित -------------------------

सार्वजनिक स्ट्रिंग अनुवाद (स्ट्रिंग इनपुट, स्ट्रिंग languagePair) {

try 
    { 


     //Don't use UtF Encoding 
     // use default webclient encoding 
     //input  [string to translate] 
     //Languagepair [eg|es] 

     var url = String.Format("http://www.google.com/translate_t?hl=en&text={0}&langpair={1}", "►" + input.Trim() + "◄", languagePair); 

     var webClient = new WebClient(); 
     string result = webClient.DownloadString(url); //get all data from google translate 

     int start = result.IndexOf("id=result_box"); 
     int end = result.IndexOf("id=spell-place-holder"); 
     int length = end - start; 
     result = result.Substring(start, length); 
     result = reverseString(result); 

     start = result.IndexOf(";8669#&");//◄ 
     end = result.IndexOf(";8569#&"); //► 
     length = end - start; 

     result = result.Substring(start + 7, length - 8); 

     //return transalted string 
     return reverseString(result); 


    } 
    catch (Exception ex) 
    { 
     return "Google translate exception occured no resource saved..." + ex.Message"; 

    } 
} 
+0

आपके उत्तर के लिए धन्यवाद। क्या आप मुझे थोड़ा और अंतर्दृष्टि प्रदान कर सकते हैं कि यह मेरे कोड में कहां जाना चाहिए, उदाहरण के लिए। विधि का नाम और पैरामीटर। किसी भी सहायता की सराहना की जाएगी। –

+0

@ कैमरॉन कृपया नए संपादित कोड पर एक नज़र डालें जो आपके लिए काम करे .. कोई प्रश्न कृपया मुझे बताएं ... – Shaz

0

अपने दृष्टिकोण के साथ कई मुद्दों कर रहे हैं। सबसे पहले यूटीएफ 8 एन्कोडिंग एक मल्टीबाइट एन्कोडिंग है। इसका अर्थ यह है कि यदि आप किसी भी गैर-ASCII चरित्र (char कोड> 127) का उपयोग करते हैं, तो आपको विशेष वर्णों की श्रृंखला मिल जाएगी जो सिस्टम को इंगित करती हैं कि यह एक यूनिकोड चार है। तो वास्तव में आपका अनुक्रम 23 9, 1 9 1, 18 9 एक एकल चरित्र इंगित करता है जो एएससीआईआई चरित्र नहीं है। यदि आप यूटीएफ 16 का उपयोग करते हैं, तो आपको फिक्स्ड-साइज एन्कोडिंग (2-बाइट एन्कोडिंग) मिलती है जो वास्तव में किसी अज्ञात शॉर्ट (0-65535) पर एक चरित्र को मैप करती है।

सी # में चार प्रकार के एक दो बाइट प्रकार है, तो यह वास्तव में एक अहस्ताक्षरित कम है। यह अन्य भाषाओं के साथ विरोधाभास करता है, जैसे सी/सी ++ जहां चार प्रकार 1-बाइट प्रकार है।

तो आपके मामले में, जब तक आप वास्तव में बाइट [] सरणियों उपयोग करने की आवश्यकता है, तो आप चार [] सरणियों का उपयोग करना चाहिए। या यदि आप वर्णों को एन्कोड करना चाहते हैं ताकि उन्हें HTML में उपयोग किया जा सके, तो आप केवल वर्णों के माध्यम से पुनरावृत्त कर सकते हैं और जांच सकते हैं कि वर्ण कोड> 128 है, तो आप इसे &hex; वर्ण कोड के साथ प्रतिस्थापित कर सकते हैं।

संबंधित मुद्दे