7

Assembly C# を使用する Unity のプロジェクトに取り組んでいます。é などの特殊文字を取得しようとしましたが、コンソールには空白文字 "" が表示されます。たとえば、「How are you?」を翻訳します。"Cómo Estás?" を返す必要がありますが、"Cmo Ests" を返します。戻り文字列「Cmo Ests」を文字配列に入れて、null 以外の空白文字であることに気付きました。私は 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 + "&#39;";  
        }else{
            returnString = returnString + letters[i];   
        }
    }
    return returnString;
}
}
4

5 に答える 5

1

別の API/URL を使用する必要があるかもしれません。以下のこの関数は、JSON データを返す別の 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"];
        }
    }

これをコンソール アプリで実行すると、次のようになります。

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

表示されます

¿Cómo estás?
于 2012-11-20T18:24:35.660 に答える
0

GoogleTranslate API についてはよくわかりませんが、最初に考えたのは、Unicode の正規化に問題があるということです。

見てSystem.String.Normalize()、それは友達です。

Unicode は非常に複雑なので、単純化しすぎます。多くの記号は、Unicode ではさまざまな方法で表すことができます。 APIから戻って、まったく別の何か。

正規化関数は、文字列を同じテキストの意味を持つものに変換しますが、出力の問題を解決する可能性のある異なるバイナリ値になる可能性があります。

于 2012-11-20T15:09:42.043 に答える
0

あなたのアプローチにはいくつかの問題があります。まず、UTF8 エンコーディングはマルチバイト エンコーディングです。これは、ASCII 以外の文字 (char コードが 127 より大きい) を使用すると、これが Unicode char であることをシステムに示す一連の特殊文字を取得することを意味します。したがって、実際には、シーケンス 239、191、189 は、ASCII 文字ではない単一の文字を示しています。UTF16 を使用すると、文字を unsigned short (0-65535) に実際にマップする固定サイズのエンコーディング (2 バイトのエンコーディング) が得られます。

c# の char 型は 2 バイト型なので、実際には unsigned short です。これは、char 型が 1 バイト型である C/C++ などの他の言語とは対照的です。

したがって、あなたの場合、実際に byte[] 配列を使用する必要がない限り、char[] 配列を使用する必要があります。または、HTML で使用できるように文字をエンコードする場合は、文字を反復処理して、文字コードが 128 より大きいかどうかを確認し、それを &hex; に置き換えることができます。文字コード。

于 2012-11-26T16:38:50.037 に答える
0

あなたは実際にはほとんどそれを持っています。コード化された文字に \u を挿入するだけで機能します。

string mystr = "C\u00f3mo Est\u00e1s?";
于 2012-11-09T16:08:38.620 に答える
0

私のプロジェクトの 1 つ [Language Resource Localization Translation] で同じ問題が発生しました。

私は同じことをしていて、.. System.Text.Encoding.UTF8.GetBytes() を使用していました.utf8エンコーディングのために、結果文字列で239、191、189などの特殊文字を受け取っていました。

私の解決策を見てください...これが役立つことを願っています

エンコーディングを一切使用しないでください。Google 翻訳は、文字列内のそのままのように正しいものを返します。文字列操作を行い、文字列をそのまま読み取ります...

一般的な解決策[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() + "◄" として送信して、Google からの戻り翻訳の開始と終了を決定しています。

また、言語ユーティリティ ツールを確認したところ、「Cómo Estás?」というメッセージが表示されます。Google翻訳にHow are youを送信するとき... :)

よろしく[シャズ]

------------------------------- 編集 ----------------------- ---

public string Translate(文字列入力、文字列 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";

    }
}
于 2012-11-22T11:42:23.733 に答える