c# - 如何从角色中获取数据

标签 c# utf-8 unity3d .net-assembly google-translate

我正在 Unity 中开发一个使用 Assembly C# 的项目。我尝试获取特殊字符,例如 é,但在控制台中它只显示一个空白字符:“”。例如翻译“你好吗?”应该返回“Cómo Estás?”,但它返回“Cmo Ests”。我把返回字符串“Cmo Ests”放在一个字符数组中,发现它是一个非空的空白字符。我正在使用 Encoding.UTF8,当我这样做时:

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

它将打印“é”。我尝试使用以下方法从给定字符串中获取字节:

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

在翻译“How are you?”时,它会返回一个字节串,但是对于像 é 这样的特殊字符,我得到的是字节序列 239、191、189,这是一个替换字符。

我需要从字符中检索什么类型的信息才能准确确定它是什么字符?我是否需要对 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;
}
}

最佳答案

也许您应该使用另一个 API/URL。下面的函数使用不同的 url 返回 JSON 数据并且似乎工作得更好:

    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"];
        }
    }

如果我在控制台应用程序中运行它:

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

会显示

¿Cómo estás?

关于c# - 如何从角色中获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13311057/

相关文章:

c# - 将许多变量从 Unity 发送到 Arduino

c# - 如何续订过期的 ClickOnce 证书?

java - 表单上的错误编码到 Spring MVC

mysql - 当 Perl 错误地说 : `DBI->connect()` ? 时,如何将 "utf8mb4 is not a compiled character set"发送到 MySQL

python - 使用 Python3 读取 srt(字幕)文件

c# - 在 (0, 0) 处的单位圆上获取随机点

user-interface - mask UI 图像/原始图像

c# - 解决条件依赖 autofac

c# - 使用 LINQ 将以前的记录获取到当前记录

c# - 在 ASP MVC 和 Entity Framework 中提交后页面会自行重新加载