Advertisement
Guest User

Trying to get libmecab.dll (MeCab) to work with C#

a guest
Mar 29th, 2012
544
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.36 KB | None | 0 0
  1. public class Mecab
  2. {
  3. [DllImport("libmecab.dll", CallingConvention = CallingConvention.Cdecl, CharSet=CharSet.Unicode)]
  4. private extern static IntPtr mecab_new2(string arg);
  5. [DllImport("libmecab.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
  6. private extern static IntPtr mecab_sparse_tostr(IntPtr m, byte[] str);
  7. [DllImport("libmecab.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
  8. private extern static void mecab_destroy(IntPtr m);
  9.  
  10. public static String Parse(String input)
  11. {
  12. IntPtr mecab = mecab_new2("");
  13. IntPtr nativeStr = mecab_sparse_tostr(mecab, Encoding.UTF8.GetBytes(input));
  14. int size = nativeArraySize(nativeStr) - 1;
  15. byte[] data = new byte[size];
  16. Marshal.Copy(nativeStr, data, 0, size);
  17.  
  18. mecab_destroy(mecab);
  19.  
  20. return Encoding.UTF8.GetString(data);
  21. }
  22.  
  23. private static int nativeArraySize(IntPtr ptr)
  24. {
  25. int size = 0;
  26. while (Marshal.ReadByte(ptr, size) > 0)
  27. size++;
  28.  
  29. return size;
  30. }
  31. }
  32.  
  33. public class Mecab
  34. {
  35. [DllImport("libmecab.dll", CallingConvention = CallingConvention.Cdecl, CharSet=CharSet.Unicode)]
  36. private extern static IntPtr mecab_new2(string arg);
  37. [DllImport("libmecab.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
  38. private extern static IntPtr mecab_sparse_tostr(IntPtr m, byte[] str);
  39. [DllImport("libmecab.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
  40. private extern static void mecab_destroy(IntPtr m);
  41.  
  42. public static String Parse(String input)
  43. {
  44. IntPtr mecab = mecab_new2("");
  45. IntPtr nativeStr = mecab_sparse_tostr(mecab, Encoding.UTF8.GetBytes(input));
  46. int size = nativeArraySize(nativeStr) - 1;
  47. byte[] data = new byte[size];
  48. Marshal.Copy(nativeStr, data, 0, size);
  49.  
  50. mecab_destroy(mecab);
  51.  
  52. return Encoding.UTF8.GetString(data);
  53. }
  54.  
  55. private static int nativeArraySize(IntPtr ptr)
  56. {
  57. int size = 0;
  58. while (Marshal.ReadByte(ptr, size) > 0)
  59. size++;
  60.  
  61. return size;
  62. }
  63. }
  64.  
  65. public class Mecab
  66. {
  67. [DllImport("libmecab.dll", CallingConvention = CallingConvention.Cdecl, CharSet=CharSet.Unicode)]
  68. private extern static IntPtr mecab_new2(string arg);
  69. [DllImport("libmecab.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
  70. private extern static IntPtr mecab_sparse_tostr(IntPtr m, byte[] str);
  71. [DllImport("libmecab.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
  72. private extern static void mecab_destroy(IntPtr m);
  73.  
  74. public static String Parse(String input)
  75. {
  76. IntPtr mecab = mecab_new2("");
  77. IntPtr nativeStr = mecab_sparse_tostr(mecab, Encoding.UTF8.GetBytes(input));
  78. int size = nativeArraySize(nativeStr) - 1;
  79. byte[] data = new byte[size];
  80. Marshal.Copy(nativeStr, data, 0, size);
  81.  
  82. mecab_destroy(mecab);
  83.  
  84. return Encoding.UTF8.GetString(data);
  85. }
  86.  
  87. private static int nativeArraySize(IntPtr ptr)
  88. {
  89. int size = 0;
  90. while (Marshal.ReadByte(ptr, size) > 0)
  91. size++;
  92.  
  93. return size;
  94. }
  95. }
  96.  
  97. public class Mecab
  98. {
  99. [DllImport("libmecab.dll", CallingConvention = CallingConvention.Cdecl, CharSet=CharSet.Unicode)]
  100. private extern static IntPtr mecab_new2(string arg);
  101. [DllImport("libmecab.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
  102. private extern static IntPtr mecab_sparse_tostr(IntPtr m, byte[] str);
  103. [DllImport("libmecab.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
  104. private extern static void mecab_destroy(IntPtr m);
  105.  
  106. public static String Parse(String input)
  107. {
  108. IntPtr mecab = mecab_new2("");
  109. IntPtr nativeStr = mecab_sparse_tostr(mecab, Encoding.UTF8.GetBytes(input));
  110. int size = nativeArraySize(nativeStr) - 1;
  111. byte[] data = new byte[size];
  112. Marshal.Copy(nativeStr, data, 0, size);
  113.  
  114. mecab_destroy(mecab);
  115.  
  116. return Encoding.UTF8.GetString(data);
  117. }
  118.  
  119. private static int nativeArraySize(IntPtr ptr)
  120. {
  121. int size = 0;
  122. while (Marshal.ReadByte(ptr, size) > 0)
  123. size++;
  124.  
  125. return size;
  126. }
  127. }
  128.  
  129. public class Mecab
  130. {
  131. [DllImport("libmecab.dll", CallingConvention = CallingConvention.Cdecl, CharSet=CharSet.Unicode)]
  132. private extern static IntPtr mecab_new2(string arg);
  133. [DllImport("libmecab.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
  134. private extern static IntPtr mecab_sparse_tostr(IntPtr m, byte[] str);
  135. [DllImport("libmecab.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
  136. private extern static void mecab_destroy(IntPtr m);
  137.  
  138. public static String Parse(String input)
  139. {
  140. IntPtr mecab = mecab_new2("");
  141. IntPtr nativeStr = mecab_sparse_tostr(mecab, Encoding.UTF8.GetBytes(input));
  142. int size = nativeArraySize(nativeStr) - 1;
  143. byte[] data = new byte[size];
  144. Marshal.Copy(nativeStr, data, 0, size);
  145.  
  146. mecab_destroy(mecab);
  147.  
  148. return Encoding.UTF8.GetString(data);
  149. }
  150.  
  151. private static int nativeArraySize(IntPtr ptr)
  152. {
  153. int size = 0;
  154. while (Marshal.ReadByte(ptr, size) > 0)
  155. size++;
  156.  
  157. return size;
  158. }
  159. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement