我正在Unity中使用Assembly C#的项目。我尝试获得特殊字符,例如é,但在控制台中它只显示一个空白字符:“”。例如翻译“你好吗?”应该返回“CómoEstás?”,但它会返回“Cmo Ests”。我将返回字符串“Cmo Ests”放在一个字符数组中,并意识到它是一个非空的空白字符。我正在使用Encoding.UTF8,当我这样做时:
char ch = '\u00e9';
print (ch);
会打印“é”。我尝试使用以下方法从给定字符串中获取字节:
byte[] utf8bytes = System.Text.Encoding.UTF8.GetBytes(temp);
在翻译“你好吗?”时,它会返回一个字节字符串,但对于特殊字符如é,我得到一系列字节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 + "'";
}else{
returnString = returnString + letters[i];
}
}
return returnString;
}
}
答案 0 :(得分:1)
也许你应该使用另一个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?
答案 1 :(得分:0)
你其实很喜欢它。只需插入带有\ u的编码字母就可以了。
string mystr = "C\u00f3mo Est\u00e1s?";
答案 2 :(得分:0)
我对GoogleTranslate API了解不多,但我首先想到的是你有一个Unicode规范化问题。
看看System.String.Normalize()
,这是朋友。
Unicode非常复杂,所以我会过度简化!许多符号可以用Unicode以不同的方式表示,即:'é'可以表示为'é'(一个字符),或者表示为'e'+'重音字符'(两个字符),或者,取决于什么从API返回,完全不同于其他东西。
Normalize函数会将您的字符串转换为具有相同Textual含义的字符串,但可能会使用不同的二进制值来修复输出问题。
答案 3 :(得分:0)
我在我的项目[语言资源本地化翻译]
中遇到了同样的问题我正在做同样的事情并且正在使用.. System.Text.Encoding.UTF8.GetBytes(),因为utf8编码正在接收像你这样的特殊字符 例如,结果字符串中的239,191,189。
请看一下我的解决方案...希望这有帮助
不要在所有谷歌翻译中使用编码将返回正确的字符串中的。做一些字符串操作并按原样读取字符串......
通用解决方案 [适用于Google支持的每种语言翻译]
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);
}
从代码中可以看出,没有执行编码,我发送2个特殊的键字符号为“►”+ txtNewResourceValue.Text.Trim()+“◄”,以确定返回转换的开始和结束谷歌。
此外,我已经检查了我的语言实用工具我得到了“CómoEstás?”发送时 你如何谷歌翻译... :)
祝你好运 [Shaz]
---------------------------被修改------------------- ------
public string Translate(String input,String 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";
}
}
答案 4 :(得分:0)
您的方法存在一些问题。首先,UTF8编码是多字节编码。这意味着如果您使用任何非ASCII字符(char代码> 127),您将获得一系列特殊字符,向系统指示这是一个Unicode字符。所以实际上你的序列239,191,189表示一个不是ASCII字符的单个字符。如果你使用UTF16,那么你得到固定大小的编码(2字节编码),它实际上将一个字符映射到一个无符号的短(0-65535)。
c#中的char类型是一个双字节类型,因此它实际上是一个unsigned short。这与其他语言形成对比,例如C / C ++,其中char类型是1字节类型。
所以在你的情况下,除非你真的需要使用byte []数组,否则你应该使用char []数组。或者,如果您想对字符进行编码以便可以在HTML中使用,那么您可以遍历字符并检查字符代码是否为&gt; 128,然后你可以用&amp; hex替换它;字符代码。