2011-06-22 23 views
1

Kakasiツールを使って、日本語とローマ字の間で英字に変換したいです。 「㼿: - 私はローマ字を受けませんが、奇妙な何か日本語とローマ字のカカシ

  1. 悪い出力:私は2つの問題を持っている

    KakasiCs.SetParams(new[] { "kakasi", "-ja", "-ga", "-ka", "-Ea", "-Ka", "-Ha", "-Ja", "-U", "-s",}); 
    var x = KakasiCs.DoKakasi("さかき"); 
    

    [DllImport("kakasi.dll")] 
        static extern int kakasi_getopt_argv(int size, IntPtr param); 
        [DllImport("kakasi.dll")] 
        static extern IntPtr kakasi_do([MarshalAs(UnmanagedType.LPStr)]string str); 
    
        public static void SetParams(string [] paramz) 
        { 
         kakasi_getopt_argv(paramz.Length, StringToIntPtr(paramz)); 
        } 
    
        public static string DoKakasi(string japanese) 
        { 
         return Marshal.PtrToStringAuto(kakasi_do(japanese)); 
        } 
    
        private static IntPtr StringToIntPtr(string[] strings) 
        { 
         int bytesCount; 
         IntPtr ptr = IntPtr.Zero; 
         ArrayList stringBytes = new ArrayList(); 
         foreach (string str in strings) 
         { 
          stringBytes.AddRange(Encoding.Unicode.GetBytes(str)); 
          stringBytes.Add((byte)'\0'); 
         } 
         bytesCount = stringBytes.Count; 
         try 
         { 
          ptr = Marshal.AllocHGlobal(bytesCount); 
          Marshal.Copy((byte[])stringBytes.ToArray(typeof(byte)) 
           , 0 
           , ptr 
           , bytesCount); 
          return ptr; 
         } 
         catch 
         { 
          if (ptr != IntPtr.Zero) 
           Marshal.FreeHGlobal(ptr); 
          throw; 
         } 
        } 
    

    そして、このために、私はラッパーを作成しました?Äꈎᅵ鄠 "。

  2. VS2010では、PInvokeStackImbalance例外で警告が表示されるたびに表示されます。

何か助けていただければ幸いです。ありがとう。

+1

を使用 ここでコードが私はので、私は本当に助けることができないこのライブラリに慣れていないんだけど、私はあなたが任意のひらがなやカタカナに対応していません。そこにはいくつかのローマ字持って気づきました。具体的には、Ea、jaおよびs。 Eaには2文字が必要ですが、Jaの種類には2が必要です(実際にはUnicodeでどのように表現されるかはわかりません)。 – MGZero

+0

@MGZero、通知ありがとうございます。私は霧のように日本にいるので、興味深い情報です。 – Zelzer

+0

ライブラリーを少し読んだところ、これは漢字をひらがな、カタカナ、ローマ字に変換するためのものです。これは、実際にはこのライブラリを使用して文章全体を翻字することができないことに注意してください。 – MGZero

答えて

1

私はこのライブラリを使用しています(C++ビルダーのみ)。文字列をkakasiに渡す前に、文字列をSHIFT-JISコードページに一致させる必要があります。処理後、それをユニコードに変換し直します。私は

... 
    char*shift_jis=CodePageConverter::fromUnicode(932,InputTextBox->Text.c_bstr()); 
    char*converted_text=ProcessText(shift_jis); 
    OutputTextBox->Text=CodePageConverter::toUnicode(932,converted_text); 


    ... 
    char* TForm1::ProcessText(char*string) 
    { 
     int paramscount=0; 
     char**argv=CreateParameters(paramscount); 

     kakasi_getopt_argv(paramscount, argv); 
     char*result=kakasi_do(string); 
     DeleteArguments(argv,paramscount); 
     return result; 
    } 
    ...