123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- using Microsoft.International.Converters;
- using System;
- using System.Runtime.InteropServices;
- namespace BeatLyrics.Tool.Utils
- {
- public class JapaneseConverter : IDisposable
- {
- private const string ProgId = "MSIME.Japan";
- private readonly IFELanguage _instance;
- public JapaneseConverter()
- {
- if (!(Activator.CreateInstance(Type.GetTypeFromProgID(ProgId)) is IFELanguage ifelang))
- {
- throw new Exception($"Could not create object of {ProgId}, is STAThread attribute missing?");
- }
- var hr = ifelang.Open();
- if (hr != 0) throw Marshal.GetExceptionForHR(hr);
- hr = ifelang.GetPhonetic("東京は昨日雪が降りました。", 1, -1, out _);
- if (hr != 0) throw Marshal.GetExceptionForHR(hr);
- _instance = ifelang;
- }
- public string HiraganaToKanji(string input)
- {
- var hr = _instance.GetConversion(input, 1, -1, out var result);
- if (hr != 0) throw Marshal.GetExceptionForHR(hr);
- return result;
- }
- public string RomajiToKanji(string input)
- {
- var output = KanaConverter.RomajiToHiragana(input);
- var hr = _instance.GetConversion(output, 1, -1, out var result);
- if (hr != 0) throw Marshal.GetExceptionForHR(hr);
- return result;
- }
- public void Dispose()
- {
- _instance?.Close();
- }
- // IFELanguage2 Interface ID
- //[Guid("21164102-C24A-11d1-851A-00C04FCC6B14")]
- [ComImport]
- [Guid("019F7152-E6DB-11d0-83C3-00C04FDDB82E")]
- [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
- private interface IFELanguage
- {
- int Open();
- int Close();
- int GetJMorphResult(uint dwRequest, uint dwCMode, int cwchInput, [MarshalAs(UnmanagedType.LPWStr)] string pwchInput, IntPtr pfCInfo, out object ppResult);
- int GetConversionModeCaps(ref uint pdwCaps);
- int GetPhonetic([MarshalAs(UnmanagedType.BStr)] string @string, int start, int length, [MarshalAs(UnmanagedType.BStr)] out string result);
- int GetConversion([MarshalAs(UnmanagedType.BStr)] string @string, int start, int length, [MarshalAs(UnmanagedType.BStr)] out string result);
- }
- }
- }
|