Я хочу транслитерировать японский язык на ромадзи с помощью инструмента 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 проблемы:
- Плохой вывод - я не получаю ромадзи, но что-то странное: "㼿? Ä ꈎ ᅵ 鄠".
- В VS2010 каждый раз я получаю предупреждение с исключением PInvokeStackImbalance.
Любая помощь приветствуется. Спасибо.