С японского на ромаджи с какаси - PullRequest
1 голос
/ 22 июня 2011

Я хочу транслитерировать японский язык на ромадзи с помощью инструмента Kakasi , используя C #. Для этого я создал обертку:

    [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;
        }
    }

А потом:

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

У меня 2 проблемы:

  1. Плохой вывод - я не получаю ромадзи, но что-то странное: "㼿? Ä ꈎ ᅵ 鄠".
  2. В VS2010 каждый раз я получаю предупреждение с исключением PInvokeStackImbalance.

Любая помощь приветствуется. Спасибо.

1 Ответ

1 голос
/ 03 августа 2011

Я использовал эту библиотеку (только с C ++ Builder). Перед передачей строки в 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;
    }
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...