本文介绍了日语罗马字与Kakasi的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我要音译日语罗马字与工具,使用C#。对于这一点,我创建了一个包装:
I want to transliterate Japanese to Romaji with Kakasi tool, using C#. For this, I created a wrapper:
[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个问题:
I have 2 problems:
- 坏输出 - 我没有收到罗马字,但奇怪的事情:㼿Äꈎᅵ鄠?。
- 在VS2010每次我收到PInvokeStackImbalance异常的预警时间。
任何帮助表示赞赏。谢谢你。
Any help is appreciated. Thanks.
推荐答案
我已经使用这个库(只用C ++ Builder)。字符串传递给kakasi之前,您应该konvert字符串的SHIFT-JIS代码页。处理之后将其转换回为Unicode。
在这里,我使用的代码
I have used this library(only with c++ builder). Before passing the string to the kakasi, you should konvert string to the SHIFT-JIS code page. After processing convert it back to the unicode.Here the code that I use
...
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;
}
...
这篇关于日语罗马字与Kakasi的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!