JapaneseConverter.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. using Microsoft.International.Converters;
  2. using System;
  3. using System.Runtime.InteropServices;
  4. namespace BeatLyrics.Tool.Utils
  5. {
  6. public class JapaneseConverter : IDisposable
  7. {
  8. private const string ProgId = "MSIME.Japan";
  9. private readonly IFELanguage _instance;
  10. public JapaneseConverter()
  11. {
  12. if (!(Activator.CreateInstance(Type.GetTypeFromProgID(ProgId)) is IFELanguage ifelang))
  13. {
  14. throw new Exception($"Could not create object of {ProgId}, is STAThread attribute missing?");
  15. }
  16. var hr = ifelang.Open();
  17. if (hr != 0) throw Marshal.GetExceptionForHR(hr);
  18. hr = ifelang.GetPhonetic("東京は昨日雪が降りました。", 1, -1, out _);
  19. if (hr != 0) throw Marshal.GetExceptionForHR(hr);
  20. _instance = ifelang;
  21. }
  22. public string HiraganaToKanji(string input)
  23. {
  24. var hr = _instance.GetConversion(input, 1, -1, out var result);
  25. if (hr != 0) throw Marshal.GetExceptionForHR(hr);
  26. return result;
  27. }
  28. public string RomajiToKanji(string input)
  29. {
  30. var output = KanaConverter.RomajiToHiragana(input);
  31. var hr = _instance.GetConversion(output, 1, -1, out var result);
  32. if (hr != 0) throw Marshal.GetExceptionForHR(hr);
  33. return result;
  34. }
  35. public void Dispose()
  36. {
  37. _instance?.Close();
  38. }
  39. // IFELanguage2 Interface ID
  40. //[Guid("21164102-C24A-11d1-851A-00C04FCC6B14")]
  41. [ComImport]
  42. [Guid("019F7152-E6DB-11d0-83C3-00C04FDDB82E")]
  43. [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
  44. private interface IFELanguage
  45. {
  46. int Open();
  47. int Close();
  48. int GetJMorphResult(uint dwRequest, uint dwCMode, int cwchInput, [MarshalAs(UnmanagedType.LPWStr)] string pwchInput, IntPtr pfCInfo, out object ppResult);
  49. int GetConversionModeCaps(ref uint pdwCaps);
  50. int GetPhonetic([MarshalAs(UnmanagedType.BStr)] string @string, int start, int length, [MarshalAs(UnmanagedType.BStr)] out string result);
  51. int GetConversion([MarshalAs(UnmanagedType.BStr)] string @string, int start, int length, [MarshalAs(UnmanagedType.BStr)] out string result);
  52. }
  53. }
  54. }