public static string ToPinyin(string s, PinyinStyle style = PinyinStyle.ToneNumber) { return(s == null ? null : string.Join(" ", s .Select(ch => ToPinyins(ch, style)) .Where(pys => pys != null) .Select(pys => string.Join("/", pys)))); }
public static string ConvertSinglePinyinByStyle(string strPinyin, PinyinStyle style) { if (style == PinyinStyle.None) { return(strPinyin); } if (style == PinyinStyle.Upper) { return(strPinyin.ToUpper()); } if (style == PinyinStyle.Lower) { return(strPinyin.ToLower()); } if (style == PinyinStyle.UpperFirst) { if (strPinyin.Length > 1) { return(strPinyin.Substring(0, 1).ToUpper() + strPinyin.Substring(1).ToLower()); } return(strPinyin); } Debug.Assert(false, "未定义的拼音风格"); return(strPinyin); }
/// <summary> /// 格式化拼音字符串 /// </summary> /// <param name="pinyin">拼音字符串</param> /// <param name="style">格式化类型</param> /// <returns></returns> private string FormatPinyin(string pinyin, PinyinStyle style) { switch (style) { case PinyinStyle.Normal: pinyin = GetNormalPinyin(pinyin); break; case PinyinStyle.Tone: break; case PinyinStyle.Tone2: pinyin = GetTone2Pinyin(pinyin); break; case PinyinStyle.Tone3: pinyin = GetTone3Pinyin(pinyin); break; case PinyinStyle.Initial: pinyin = GetInitialPinyin(pinyin); break; case PinyinStyle.FirstLetter: pinyin = GetFirstLetterPinyin(pinyin); break; default: break; } return(pinyin); }
public static string ToPinyin(string s, PinyinStyle style = PinyinStyle.ToneNumber) { return s == null ? null : string.Join(" ", s .Select(ch => ToPinyins(ch, style)) .Where(pys => pys != null) .Select(pys => string.Join("/", pys))); }
// 包装后的版本,兼容以前的调用习惯 public int AddPinyin(string strCfgXml, bool bUseCache = true, PinyinStyle style = PinyinStyle.None, string strPrefix = "", bool bAutoSel = false) { return(AddPinyin(strCfgXml, bUseCache, style, strPrefix, bAutoSel ? "auto" : "")); }
public static string[] ToPinyins(char ch, PinyinStyle style = PinyinStyle.ToneNumber) { if (ChineseChar.IsValidChar(ch)) { var cc = new ChineseChar(ch); switch (style) { case PinyinStyle.ToneNumber: return cc.Pinyins.Take(cc.PinyinCount).ToArray(); case PinyinStyle.NoTone: return cc.Pinyins.Take(cc.PinyinCount) .Select(py => py.Substring(0, py.Length - 1)) .Distinct().ToArray(); case PinyinStyle.Acronym: return cc.Pinyins.Take(cc.PinyinCount) .Select(py => py.Substring(0, 1)) .Distinct().ToArray(); } } return null; }
public static string[] ToPinyins(char ch, PinyinStyle style = PinyinStyle.ToneNumber) { if (ChineseChar.IsValidChar(ch)) { var cc = new ChineseChar(ch); switch (style) { case PinyinStyle.ToneNumber: return(cc.Pinyins.Take(cc.PinyinCount).ToArray()); case PinyinStyle.NoTone: return(cc.Pinyins.Take(cc.PinyinCount) .Select(py => py.Substring(0, py.Length - 1)) .Distinct().ToArray()); case PinyinStyle.Acronym: return(cc.Pinyins.Take(cc.PinyinCount) .Select(py => py.Substring(0, 1)) .Distinct().ToArray()); } } return(null); }
// 汉字字符串转换为拼音。兼容以前版本 // 如果函数中已经MessageBox报错,则strError第一字符会为空格 /// <summary> /// 汉字字符串转换为拼音,智能方式 /// </summary> /// <param name="owner">用于函数中 MessageBox 和对话框 的宿主窗口</param> /// <param name="strText">输入字符串</param> /// <param name="style">转换为拼音的风格</param> /// <param name="strPinyin">返回拼音字符串</param> /// <param name="strError">返回出错信息</param> /// <returns>-1: 出错; 0: 用户希望中断; 1: 正常; 2: 结果字符串中有没有找到拼音的汉字</returns> public int SmartHanziTextToPinyin( IWin32Window owner, string strText, PinyinStyle style, out string strPinyin, out string strError) { return SmartHanziTextToPinyin( owner, strText, style, false, out strPinyin, out strError); }
/// <summary> /// 为 MARC 编辑器内的记录加拼音 /// </summary> /// <param name="strCfgXml">拼音配置 XML</param> /// <param name="bUseCache">是否使用记录中以前缓存的结果?</param> /// <param name="style">风格</param> /// <param name="strPrefix">前缀字符串。缺省为空 [暂时没有使用本参数]</param> /// <param name="strDuoyinStyle">是否自动选择多音字。auto/first 之一或者组合</param> /// <returns>-1: 出错。包括中断的情况; 0: 正常</returns> public virtual int AddPinyin(string strCfgXml, bool bUseCache, // = true, PinyinStyle style, // = PinyinStyle.None, string strPrefix, string strDuoyinStyle) // bool bAutoSel = false) { string strError = ""; XmlDocument cfg_dom = new XmlDocument(); try { cfg_dom.LoadXml(strCfgXml); } catch (Exception ex) { strError = "strCfgXml装载到XMLDOM时出错: " + ex.Message; goto ERROR1; } this.DetailForm.MarcEditor.Enabled = false; Hashtable old_selected = (bUseCache == true) ? this.DetailForm.GetSelectedPinyin() : new Hashtable(); Hashtable new_selected = new Hashtable(); try { // PinyinStyle style = PinyinStyle.None; // 在这里修改拼音大小写风格 for (int i = 0; i < DetailForm.MarcEditor.Record.Fields.Count; i++) { Field field = DetailForm.MarcEditor.Record.Fields[i]; List <PinyinCfgItem> cfg_items = null; int nRet = GetPinyinCfgLine( cfg_dom, field.Name, field.Indicator, out cfg_items); if (nRet <= 0) { continue; } string strHanzi = ""; string strNextSubfieldName = ""; string strField = field.Text; foreach (PinyinCfgItem item in cfg_items) { for (int k = 0; k < item.From.Length; k++) { if (item.From.Length != item.To.Length) { strError = "配置事项 fieldname='" + item.FieldName + "' from='" + item.From + "' to='" + item.To + "' 其中from和to参数值的字符数不等"; goto ERROR1; } string from = new string(item.From[k], 1); string to = new string(item.To[k], 1); for (int j = 0; ; j++) { // return: // -1 error // 0 not found // 1 found nRet = MarcUtil.GetSubfield(strField, ItemType.Field, from, j, out strHanzi, out strNextSubfieldName); if (nRet != 1) { break; } if (strHanzi.Length <= 1) { break; } strHanzi = strHanzi.Substring(1); // 2013/6/13 if (MarcDetailHost.ContainHanzi(strHanzi) == false) { continue; } string strPinyin = ""; strPinyin = (string)old_selected[strHanzi]; if (string.IsNullOrEmpty(strPinyin) == true) { // 把字符串中的汉字和拼音分离 // return: // -1 出错 // 0 用户希望中断 // 1 正常 if (string.IsNullOrEmpty(this.DetailForm.MainForm.PinyinServerUrl) == true || this.DetailForm.MainForm.ForceUseLocalPinyinFunc == true) { nRet = this.DetailForm.MainForm.HanziTextToPinyin( this.DetailForm, true, // 本地,快速 strHanzi, style, strDuoyinStyle, out strPinyin, out strError); } else { // 汉字字符串转换为拼音 // 如果函数中已经MessageBox报错,则strError第一字符会为空格 // return: // -1 出错 // 0 用户希望中断 // 1 正常 // 2 结果字符串中有没有找到拼音的汉字 nRet = this.DetailForm.MainForm.SmartHanziTextToPinyin( this.DetailForm, strHanzi, style, strDuoyinStyle, out strPinyin, out strError); } if (nRet == -1) { new_selected = null; goto ERROR1; } if (nRet == 0) { new_selected = null; strError = "用户中断。拼音子字段内容可能不完整。"; goto ERROR1; } } if (new_selected != null && nRet != 2) { new_selected[strHanzi] = strPinyin; } nRet = MarcUtil.DeleteSubfield( ref strField, to, j); nRet = MarcUtil.InsertSubfield( ref strField, from, j, new string(MarcUtil.SUBFLD, 1) + to + strPinyin, 1); field.Text = strField; } } } } if (new_selected != null) { this.DetailForm.SetSelectedPinyin(new_selected); } } finally { this.DetailForm.MarcEditor.Enabled = true; this.DetailForm.MarcEditor.Focus(); } return(0); ERROR1: if (string.IsNullOrEmpty(strError) == false) { if (strError[0] != ' ') { MessageBox.Show(this.DetailForm, strError); } } return(-1); }
// 包装后的版本,兼容以前的调用习惯 public int AddPinyin(string strCfgXml, bool bUseCache = true, PinyinStyle style = PinyinStyle.None, string strPrefix = "", bool bAutoSel = false) { return AddPinyin(strCfgXml, bUseCache, style, strPrefix, bAutoSel ? "auto" : ""); }
/// <summary> /// 为 MARC 编辑器内的记录加拼音 /// </summary> /// <param name="strCfgXml">拼音配置 XML</param> /// <param name="bUseCache">是否使用记录中以前缓存的结果?</param> /// <param name="style">风格</param> /// <param name="strPrefix">前缀字符串。缺省为空 [暂时没有使用本参数]</param> /// <param name="strDuoyinStyle">是否自动选择多音字。auto/first 之一或者组合</param> /// <returns>-1: 出错。包括中断的情况; 0: 正常</returns> public virtual int AddPinyin(string strCfgXml, bool bUseCache, // = true, PinyinStyle style, // = PinyinStyle.None, string strPrefix, string strDuoyinStyle) // bool bAutoSel = false) { string strError = ""; XmlDocument cfg_dom = new XmlDocument(); try { cfg_dom.LoadXml(strCfgXml); } catch (Exception ex) { strError = "strCfgXml装载到XMLDOM时出错: " + ex.Message; goto ERROR1; } this.DetailForm.MarcEditor.Enabled = false; Hashtable old_selected = (bUseCache == true) ? this.DetailForm.GetSelectedPinyin() : new Hashtable(); Hashtable new_selected = new Hashtable(); try { // PinyinStyle style = PinyinStyle.None; // 在这里修改拼音大小写风格 for (int i = 0; i < DetailForm.MarcEditor.Record.Fields.Count; i++) { Field field = DetailForm.MarcEditor.Record.Fields[i]; List<PinyinCfgItem> cfg_items = null; int nRet = GetPinyinCfgLine( cfg_dom, field.Name, field.Indicator, out cfg_items); if (nRet <= 0) continue; string strHanzi = ""; string strNextSubfieldName = ""; string strField = field.Text; foreach (PinyinCfgItem item in cfg_items) { for (int k = 0; k < item.From.Length; k++) { if (item.From.Length != item.To.Length) { strError = "配置事项 fieldname='" + item.FieldName + "' from='" + item.From + "' to='" + item.To + "' 其中from和to参数值的字符数不等"; goto ERROR1; } string from = new string(item.From[k], 1); string to = new string(item.To[k], 1); for (int j = 0; ; j++) { // return: // -1 error // 0 not found // 1 found nRet = MarcUtil.GetSubfield(strField, ItemType.Field, from, j, out strHanzi, out strNextSubfieldName); if (nRet != 1) break; if (strHanzi.Length <= 1) break; strHanzi = strHanzi.Substring(1); // 2013/6/13 if (MarcDetailHost.ContainHanzi(strHanzi) == false) continue; string strPinyin = ""; strPinyin = (string)old_selected[strHanzi]; if (string.IsNullOrEmpty(strPinyin) == true) { // 把字符串中的汉字和拼音分离 // return: // -1 出错 // 0 用户希望中断 // 1 正常 if (string.IsNullOrEmpty(this.DetailForm.MainForm.PinyinServerUrl) == true || this.DetailForm.MainForm.ForceUseLocalPinyinFunc == true) { nRet = this.DetailForm.MainForm.HanziTextToPinyin( this.DetailForm, true, // 本地,快速 strHanzi, style, strDuoyinStyle, out strPinyin, out strError); } else { // 汉字字符串转换为拼音 // 如果函数中已经MessageBox报错,则strError第一字符会为空格 // return: // -1 出错 // 0 用户希望中断 // 1 正常 // 2 结果字符串中有没有找到拼音的汉字 nRet = this.DetailForm.MainForm.SmartHanziTextToPinyin( this.DetailForm, strHanzi, style, strDuoyinStyle, out strPinyin, out strError); } if (nRet == -1) { new_selected = null; goto ERROR1; } if (nRet == 0) { new_selected = null; strError = "用户中断。拼音子字段内容可能不完整。"; goto ERROR1; } } if (new_selected != null && nRet != 2) new_selected[strHanzi] = strPinyin; nRet = MarcUtil.DeleteSubfield( ref strField, to, j); nRet = MarcUtil.InsertSubfield( ref strField, from, j, new string(MarcUtil.SUBFLD, 1) + to + strPinyin, 1); field.Text = strField; } } } } if (new_selected != null) this.DetailForm.SetSelectedPinyin(new_selected); } finally { this.DetailForm.MarcEditor.Enabled = true; this.DetailForm.MarcEditor.Focus(); } return 0; ERROR1: if (string.IsNullOrEmpty(strError) == false) { if (strError[0] != ' ') MessageBox.Show(this.DetailForm, strError); } return -1; }
static string ConvertSinglePinyinByStyle(string strPinyin, PinyinStyle style) { if (style == PinyinStyle.None) return strPinyin; if (style == PinyinStyle.Upper) return strPinyin.ToUpper(); if (style == PinyinStyle.Lower) return strPinyin.ToLower(); if (style == PinyinStyle.UpperFirst) { if (strPinyin.Length > 1) { return strPinyin.Substring(0,1).ToUpper() + strPinyin.Substring(1).ToLower(); } return strPinyin; } Debug.Assert(false,"未定义的拼音风格"); return strPinyin; }
// 汉字字符串转换为拼音。新版本 // 如果函数中已经MessageBox报错,则strError第一字符会为空格 /// <summary> /// 汉字字符串转换为拼音,智能方式 /// </summary> /// <param name="owner">用于函数中 MessageBox 和对话框 的宿主窗口</param> /// <param name="strText">输入字符串</param> /// <param name="style">转换为拼音的风格</param> /// <param name="strDuoyinStyle">是否自动选择多音字。auto/first 的一个或者组合。如果为 auto,first 表示优先按照智能拼音选择,没有智能拼音的,选择第一个</param> /// <param name="strPinyin">返回拼音字符串</param> /// <param name="strError">返回出错信息</param> /// <returns>-1: 出错; 0: 用户希望中断; 1: 正常; 2: 结果字符串中有没有找到拼音的汉字</returns> public int SmartHanziTextToPinyin( IWin32Window owner, string strText, PinyinStyle style, string strDuoyinStyle, // bool bAutoSel, out string strPinyin, out string strError) { strPinyin = ""; strError = ""; bool bAuto = StringUtil.IsInList("auto", strDuoyinStyle); bool bFirst = StringUtil.IsInList("first", strDuoyinStyle); bool bNotFoundPinyin = false; // 是否出现过没有找到拼音、只能把汉字放入结果字符串的情况 Stop new_stop = new DigitalPlatform.Stop(); new_stop.Register(this.stopManager, true); // 和容器关联 new_stop.OnStop += new StopEventHandler(new_stop_OnStop); new_stop.Initial("正在获得 '" + strText + "' 的拼音信息 (从服务器 " + this.PinyinServerUrl + ")..."); new_stop.BeginLoop(); m_gcatClient = null; try { m_gcatClient = GcatNew.CreateChannel(this.PinyinServerUrl); REDO_GETPINYIN: //int nStatus = -1; // 前面一个字符的类型 -1:前面没有字符 0:普通英文字母 1:空格 2:汉字 string strPinyinXml = ""; // return: // -2 strID验证失败 // -1 出错 // 0 成功 int nRet = GcatNew.GetPinyin( new_stop, m_gcatClient, m_strPinyinGcatID, strText, out strPinyinXml, out strError); if (nRet == -1) { if (new_stop != null && new_stop.State != 0) return 0; DialogResult result = MessageBox.Show(owner, "从服务器 '" + this.PinyinServerUrl + "' 获取拼音的过程出错:\r\n" + strError + "\r\n\r\n是否要临时改为使用本机加拼音功能? \r\n\r\n(注:临时改用本机拼音的状态在程序退出时不会保留。如果要永久改用本机拼音方式,请使用主菜单的“参数配置”命令,将“服务器”属性页的“拼音服务器URL”内容清空)", "EntityForm", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2); if (result == System.Windows.Forms.DialogResult.Yes) { this.ForceUseLocalPinyinFunc = true; strError = "将改用本机拼音,请重新操作一次。(本次操作出错: " + strError + ")"; return -1; } strError = " " + strError; return -1; } if (nRet == -2) { IdLoginDialog login_dlg = new IdLoginDialog(); login_dlg.Text = "获得拼音 -- " + ((string.IsNullOrEmpty(this.m_strPinyinGcatID) == true) ? "请输入ID" : strError); login_dlg.ID = this.m_strPinyinGcatID; login_dlg.SaveID = this.m_bSavePinyinGcatID; login_dlg.StartPosition = FormStartPosition.CenterScreen; if (login_dlg.ShowDialog(owner) == DialogResult.Cancel) { return 0; } this.m_strPinyinGcatID = login_dlg.ID; this.m_bSavePinyinGcatID = login_dlg.SaveID; goto REDO_GETPINYIN; } XmlDocument dom = new XmlDocument(); try { dom.LoadXml(strPinyinXml); } catch (Exception ex) { strError = "strPinyinXml装载到XMLDOM时出错: " + ex.Message; return -1; } foreach (XmlNode nodeWord in dom.DocumentElement.ChildNodes) { if (nodeWord.NodeType == XmlNodeType.Text) { SelPinyinDlg.AppendText(ref strPinyin, nodeWord.InnerText); //nStatus = 0; continue; } if (nodeWord.NodeType != XmlNodeType.Element) continue; string strWordPinyin = DomUtil.GetAttr(nodeWord, "p"); if (string.IsNullOrEmpty(strWordPinyin) == false) strWordPinyin = strWordPinyin.Trim(); // 目前只取多套读音的第一套 nRet = strWordPinyin.IndexOf(";"); if (nRet != -1) strWordPinyin = strWordPinyin.Substring(0, nRet).Trim(); string[] pinyin_parts = strWordPinyin.Split(new char[] { ' ' }); int index = 0; // 让选择多音字 foreach (XmlNode nodeChar in nodeWord.ChildNodes) { if (nodeChar.NodeType == XmlNodeType.Text) { SelPinyinDlg.AppendText(ref strPinyin, nodeChar.InnerText); //nStatus = 0; continue; } string strHanzi = nodeChar.InnerText; string strCharPinyins = DomUtil.GetAttr(nodeChar, "p"); if (String.IsNullOrEmpty(strCharPinyins) == true) { strPinyin += strHanzi; //nStatus = 0; index++; continue; } if (strCharPinyins.IndexOf(";") == -1) { DomUtil.SetAttr(nodeChar, "sel", strCharPinyins); SelPinyinDlg.AppendPinyin(ref strPinyin, SelPinyinDlg.ConvertSinglePinyinByStyle( strCharPinyins, style) ); //nStatus = 2; index++; continue; } #if _TEST_PINYIN // 调试! string[] parts = strCharPinyins.Split(new char[] {';'}); { DomUtil.SetAttr(nodeChar, "sel", parts[0]); AppendPinyin(ref strPinyin, parts[0]); nStatus = 2; index++; continue; } #endif string strSampleText = ""; int nOffs = -1; SelPinyinDlg.GetOffs(dom.DocumentElement, nodeChar, out strSampleText, out nOffs); { // 如果是多个拼音 SelPinyinDlg dlg = new SelPinyinDlg(); //float ratio_single = dlg.listBox_multiPinyin.Font.SizeInPoints / dlg.Font.SizeInPoints; //float ratio_sample = dlg.textBox_sampleText.Font.SizeInPoints / dlg.Font.SizeInPoints; MainForm.SetControlFont(dlg, this.Font, false); // 维持字体的原有大小比例关系 //dlg.listBox_multiPinyin.Font = new Font(dlg.Font.FontFamily, ratio_single * dlg.Font.SizeInPoints, GraphicsUnit.Point); //dlg.textBox_sampleText.Font = new Font(dlg.Font.FontFamily, ratio_sample * dlg.Font.SizeInPoints, GraphicsUnit.Point); // 这个对话框比较特殊 MainForm.SetControlFont(dlg, this.Font, false); dlg.Text = "请选择汉字 '" + strHanzi + "' 的拼音 (来自服务器 " + this.PinyinServerUrl + ")"; dlg.SampleText = strSampleText; dlg.Offset = nOffs; dlg.Pinyins = strCharPinyins; if (index < pinyin_parts.Length) dlg.ActivePinyin = pinyin_parts[index]; dlg.Hanzi = strHanzi; #if NO if (bAutoSel == true && string.IsNullOrEmpty(dlg.ActivePinyin) == false) { dlg.ResultPinyin = dlg.ActivePinyin; dlg.DialogResult = DialogResult.OK; } else { this.AppInfo.LinkFormState(dlg, "SelPinyinDlg_state"); dlg.ShowDialog(owner); this.AppInfo.UnlinkFormState(dlg); } #endif if (bAuto == true && string.IsNullOrEmpty(dlg.ActivePinyin) == false) { dlg.ResultPinyin = dlg.ActivePinyin; dlg.DialogResult = DialogResult.OK; } else if (bFirst == true && string.IsNullOrEmpty(dlg.Pinyins) == false) { dlg.ResultPinyin = SelPinyinDlg.GetFirstPinyin(dlg.Pinyins); dlg.DialogResult = DialogResult.OK; } else { this.AppInfo.LinkFormState(dlg, "SelPinyinDlg_state"); dlg.ShowDialog(owner); this.AppInfo.UnlinkFormState(dlg); } Debug.Assert(DialogResult.Cancel != DialogResult.Abort, "推断"); if (dlg.DialogResult == DialogResult.Abort) { return 0; // 用户希望整个中断 } DomUtil.SetAttr(nodeChar, "sel", dlg.ResultPinyin); if (dlg.DialogResult == DialogResult.Cancel) { SelPinyinDlg.AppendText(ref strPinyin, strHanzi); //nStatus = 2; bNotFoundPinyin = true; } else if (dlg.DialogResult == DialogResult.OK) { SelPinyinDlg.AppendPinyin(ref strPinyin, SelPinyinDlg.ConvertSinglePinyinByStyle( dlg.ResultPinyin, style) ); //nStatus = 2; } else { Debug.Assert(false, "SelPinyinDlg返回时出现意外的DialogResult值"); } index++; } } } #if _TEST_PINYIN #else // 2014/10/22 // 删除 word 下的 Text 节点 XmlNodeList text_nodes = dom.DocumentElement.SelectNodes("word/text()"); foreach (XmlNode node in text_nodes) { Debug.Assert(node.NodeType == XmlNodeType.Text, ""); node.ParentNode.RemoveChild(node); } // 把没有p属性的<char>元素去掉,以便上传 XmlNodeList nodes = dom.DocumentElement.SelectNodes("//char"); foreach (XmlNode node in nodes) { string strP = DomUtil.GetAttr(node, "p"); string strSelValue = DomUtil.GetAttr(node, "sel"); // 2013/9/13 if (string.IsNullOrEmpty(strP) == true || string.IsNullOrEmpty(strSelValue) == true) { XmlNode parent = node.ParentNode; parent.RemoveChild(node); // 把空的<word>元素删除 if (parent.Name == "word" && parent.ChildNodes.Count == 0 && parent.ParentNode != null) { parent.ParentNode.RemoveChild(parent); } } // TODO: 一个拼音,没有其他选择的,是否就不上载了? // 注意,前端负责新创建的拼音仍需上载;只是当初原样从服务器过来的,不用上载了 } if (dom.DocumentElement.ChildNodes.Count > 0) { // return: // -2 strID验证失败 // -1 出错 // 0 成功 nRet = GcatNew.SetPinyin( new_stop, m_gcatClient, "", dom.DocumentElement.OuterXml, out strError); if (nRet == -1) { if (new_stop != null && new_stop.State != 0) return 0; return -1; } } #endif if (bNotFoundPinyin == false) return 1; // 正常结束 return 2; // 结果字符串中有没有找到拼音的汉字 } finally { new_stop.EndLoop(); new_stop.OnStop -= new StopEventHandler(new_stop_OnStop); new_stop.Initial(""); new_stop.Unregister(); if (m_gcatClient != null) { m_gcatClient.Close(); m_gcatClient = null; } } }
/* public char[] GetSpecialChars() { string strChars = "!·#¥%……—*()——+-=[]《》<>,。?/\|{}“”‘’"; char[] result = new char[strChars.Length]; for(int i=0;i<result.Length;i++) { result[i] = strChars[i]; } return result; } */ // 兼容以前版本 public int HanziTextToPinyin( string strText, PinyinStyle style, out string strPinyin, out string strError) { return HanziTextToPinyin( false, strText, style, out strPinyin, out strError); }
// 把字符串中的汉字和拼音分离 // parameters: // bLocal 是否从本地获取拼音 // return: // -1 出错 // 0 用户希望中断 // 1 正常 public int HanziTextToPinyin( bool bLocal, string strText, PinyinStyle style, out string strPinyin, out string strError) { strError = ""; strPinyin = ""; string strSpecialChars = "!·#¥%……—*()——+-=[]《》<>,。?/\|{}“”‘’"; string strHanzi; int nStatus = -1; // 前面一个字符的类型 -1:前面没有字符 0:普通英文字母 1:空格 2:汉字 for(int i=0;i<strText.Length;i++) { char ch = strText[i]; strHanzi = ""; if (ch >= 0 && ch <= 128) { if (nStatus == 2) strPinyin += " "; strPinyin += ch; if (ch == ' ') nStatus = 1; else nStatus = 0; continue; } else { // 汉字 strHanzi += ch; } // 汉字前面出现了英文或者汉字,中间间隔空格 if (nStatus == 2 || nStatus == 0) strPinyin += " "; // 看看是否特殊符号 if (strSpecialChars.IndexOf(strHanzi) != -1) { strPinyin += strHanzi; // 放在本应是拼音的位置 nStatus = 2; continue; } // 获得拼音 string strResultPinyin = ""; int nRet = 0; if (bLocal == true) { nRet = this.MainForm.LoadQuickPinyin(true, out strError); if (nRet == -1) return -1; nRet = this.MainForm.QuickPinyin.GetPinyin( strHanzi, out strResultPinyin, out strError); } else { nRet = GetOnePinyin(strHanzi, out strResultPinyin, out strError); } if (nRet == -1) return -1; if (nRet == 0) { // canceld strPinyin += strHanzi; // 只好将汉字放在本应是拼音的位置 nStatus = 2; continue; } Debug.Assert(strResultPinyin != "", ""); strResultPinyin = strResultPinyin.Trim(); if (strResultPinyin.IndexOf(";", 0) != -1) { // 如果是多个拼音 SelPinyinDlg dlg = new SelPinyinDlg(); dlg.Font = GuiUtil.GetDefaultFont(); dlg.SampleText = strText; dlg.Offset = i; dlg.Pinyins = strResultPinyin; dlg.Hanzi = strHanzi; MainForm.AppInfo.LinkFormState(dlg, "SelPinyinDlg_state"); dlg.ShowDialog(this); MainForm.AppInfo.UnlinkFormState(dlg); Debug.Assert(DialogResult.Cancel != DialogResult.Abort, "推断"); if (dlg.DialogResult == DialogResult.Cancel) { strPinyin += strHanzi; } else if (dlg.DialogResult == DialogResult.OK) { strPinyin += ConvertSinglePinyinByStyle( dlg.ResultPinyin, style); } else if (dlg.DialogResult == DialogResult.Abort) { return 0; // 用户希望整个中断 } else { Debug.Assert(false, "SelPinyinDlg返回时出现意外的DialogResult值"); } } else { // 单个拼音 strPinyin += ConvertSinglePinyinByStyle( strResultPinyin, style); } nStatus = 2; } return 1; // 正常结束 }
// 2015/7/20 // 包装后的版本 public int HanziTextToPinyin( IWin32Window owner, bool bLocal, string strText, PinyinStyle style, bool bAutoSel, out string strPinyin, out string strError) { return HanziTextToPinyin( owner, bLocal, strText, style, (bAutoSel ? "auto" : ""), out strPinyin, out strError); }
// 汉字字符串转换为拼音 // 如果函数中已经MessageBox报错,则strError第一字符会为空格 // return: // -1 出错 // 0 用户希望中断 // 1 正常 public int SmartHanziTextToPinyin( string strText, PinyinStyle style, out string strPinyin, out string strError) { strPinyin = ""; strError = ""; Stop new_stop = new DigitalPlatform.Stop(); new_stop.Register(MainForm.stopManager, true); // 和容器关联 new_stop.OnStop += new StopEventHandler(new_stop_OnStop); new_stop.Initial("正在获得 '" + strText + "' 的拼音信息 (从服务器 " + this.MainForm.PinyinServerUrl + ")..."); new_stop.BeginLoop(); m_gcatClient = null; try { m_gcatClient = GcatNew.CreateChannel(this.MainForm.PinyinServerUrl); REDO_GETPINYIN: int nStatus = -1; // 前面一个字符的类型 -1:前面没有字符 0:普通英文字母 1:空格 2:汉字 string strPinyinXml = ""; // return: // -2 strID验证失败 // -1 出错 // 0 成功 int nRet = GcatNew.GetPinyin( new_stop, m_gcatClient, m_strPinyinGcatID, strText, out strPinyinXml, out strError); if (nRet == -1) { DialogResult result = MessageBox.Show(this, "从服务器 '" + this.MainForm.PinyinServerUrl + "' 获取拼音的过程出错:\r\n" + strError + "\r\n\r\n是否要临时改为使用本机加拼音功能? \r\n\r\n(注:临时改用本机拼音的状态在程序退出时不会保留。如果要永久改用本机拼音方式,请使用主菜单的“参数配置”命令,将“服务器”属性页的“拼音服务器URL”内容清空)", "EntityForm", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2); if (result == System.Windows.Forms.DialogResult.Yes) { this.MainForm.ForceUseLocalPinyinFunc = true; strError = "将改用本机拼音,请重新操作一次。(本次操作出错: " + strError + ")"; return -1; } strError = " " + strError; return -1; } if (nRet == -2) { IdLoginDialog login_dlg = new IdLoginDialog(); login_dlg.Text = "获得拼音 -- " + ((string.IsNullOrEmpty(this.m_strPinyinGcatID) == true) ? "请输入ID" : strError); login_dlg.ID = this.m_strPinyinGcatID; login_dlg.SaveID = this.m_bSavePinyinGcatID; login_dlg.StartPosition = FormStartPosition.CenterScreen; if (login_dlg.ShowDialog(this) == DialogResult.Cancel) { return 0; } this.m_strPinyinGcatID = login_dlg.ID; this.m_bSavePinyinGcatID = login_dlg.SaveID; goto REDO_GETPINYIN; } XmlDocument dom = new XmlDocument(); try { dom.LoadXml(strPinyinXml); } catch (Exception ex) { strError = "strPinyinXml装载到XMLDOM时出错: " + ex.Message; return -1; } foreach (XmlNode nodeWord in dom.DocumentElement.ChildNodes) { if (nodeWord.NodeType == XmlNodeType.Text) { SelPinyinDlg.AppendText(ref strPinyin, nodeWord.InnerText); nStatus = 0; continue; } if (nodeWord.NodeType != XmlNodeType.Element) continue; string strWordPinyin = DomUtil.GetAttr(nodeWord, "p"); if (string.IsNullOrEmpty(strWordPinyin) == false) strWordPinyin = strWordPinyin.Trim(); // 目前只取多套读音的第一套 nRet = strWordPinyin.IndexOf(";"); if (nRet != -1) strWordPinyin = strWordPinyin.Substring(0, nRet).Trim(); string[] pinyin_parts = strWordPinyin.Split(new char[] { ' ' }); int index = 0; // 让选择多音字 foreach (XmlNode nodeChar in nodeWord.ChildNodes) { if (nodeChar.NodeType == XmlNodeType.Text) { SelPinyinDlg.AppendText(ref strPinyin, nodeChar.InnerText); nStatus = 0; continue; } string strHanzi = nodeChar.InnerText; string strCharPinyins = DomUtil.GetAttr(nodeChar, "p"); if (String.IsNullOrEmpty(strCharPinyins) == true) { strPinyin += strHanzi; nStatus = 0; index++; continue; } if (strCharPinyins.IndexOf(";") == -1) { DomUtil.SetAttr(nodeChar, "sel", strCharPinyins); SelPinyinDlg.AppendPinyin(ref strPinyin, SelPinyinDlg.ConvertSinglePinyinByStyle( strCharPinyins, style) ); nStatus = 2; index++; continue; } #if _TEST_PINYIN // 调试! string[] parts = strCharPinyins.Split(new char[] {';'}); { DomUtil.SetAttr(nodeChar, "sel", parts[0]); AppendPinyin(ref strPinyin, parts[0]); nStatus = 2; index++; continue; } #endif string strSampleText = ""; int nOffs = -1; SelPinyinDlg.GetOffs(dom.DocumentElement, nodeChar, out strSampleText, out nOffs); { // 如果是多个拼音 SelPinyinDlg dlg = new SelPinyinDlg(); float ratio_single = dlg.listBox_multiPinyin.Font.SizeInPoints / dlg.Font.SizeInPoints; float ratio_sample = dlg.textBox_sampleText.Font.SizeInPoints / dlg.Font.SizeInPoints; GuiUtil.SetControlFont(dlg, this.Font, false); // 维持字体的原有大小比例关系 dlg.listBox_multiPinyin.Font = new Font(dlg.Font.FontFamily, ratio_single * dlg.Font.SizeInPoints, GraphicsUnit.Point); dlg.textBox_sampleText.Font = new Font(dlg.Font.FontFamily, ratio_sample * dlg.Font.SizeInPoints, GraphicsUnit.Point); // 这个对话框比较特殊 GuiUtil.SetControlFont(dlg, this.Font, false); dlg.Text = "请选择汉字 '" + strHanzi + "' 的拼音 (来自服务器 " + this.MainForm.PinyinServerUrl + ")"; dlg.SampleText = strSampleText; dlg.Offset = nOffs; dlg.Pinyins = strCharPinyins; if (index < pinyin_parts.Length) dlg.ActivePinyin = pinyin_parts[index]; dlg.Hanzi = strHanzi; MainForm.AppInfo.LinkFormState(dlg, "SelPinyinDlg_state"); dlg.ShowDialog(this); MainForm.AppInfo.UnlinkFormState(dlg); Debug.Assert(DialogResult.Cancel != DialogResult.Abort, "推断"); if (dlg.DialogResult == DialogResult.Abort) { return 0; // 用户希望整个中断 } DomUtil.SetAttr(nodeChar, "sel", dlg.ResultPinyin); if (dlg.DialogResult == DialogResult.Cancel) { SelPinyinDlg.AppendText(ref strPinyin, strHanzi); nStatus = 2; } else if (dlg.DialogResult == DialogResult.OK) { SelPinyinDlg.AppendPinyin(ref strPinyin, SelPinyinDlg.ConvertSinglePinyinByStyle( dlg.ResultPinyin, style) ); nStatus = 2; } else { Debug.Assert(false, "SelPinyinDlg返回时出现意外的DialogResult值"); } index++; } } } #if _TEST_PINYIN #else // return: // -2 strID验证失败 // -1 出错 // 0 成功 nRet = GcatNew.SetPinyin( new_stop, m_gcatClient, "", dom.DocumentElement.OuterXml, out strError); if (nRet == -1) return -1; #endif return 1; } finally { new_stop.EndLoop(); new_stop.OnStop -= new StopEventHandler(new_stop_OnStop); new_stop.Initial(""); new_stop.Unregister(); if (m_gcatClient != null) { m_gcatClient.Close(); m_gcatClient = null; } } }
// 把字符串中的汉字和拼音分离 // parameters: // bLocal 是否从本机获取拼音 // return: // -1 出错 // 0 用户希望中断 // 1 正常 /// <summary> /// 汉字字符串转换为拼音,普通方式 /// </summary> /// <param name="owner">用于函数中 MessageBox 和对话框 的宿主窗口</param> /// <param name="bLocal">是否从本地获取拼音信息</param> /// <param name="strText">输入字符串</param> /// <param name="style">转换为拼音的风格</param> /// <param name="strDuoyinStyle">处理多音字的风格</param> /// <param name="strPinyin">返回拼音字符串</param> /// <param name="strError">返回出错信息</param> /// <returns>-1: 出错; 0: 用户希望中断; 1: 正常; 2: 结果字符串中有没有找到拼音的汉字</returns> public int HanziTextToPinyin( IWin32Window owner, bool bLocal, string strText, PinyinStyle style, string strDuoyinStyle, // 2015/7/20 out string strPinyin, out string strError) { strError = ""; strPinyin = ""; bool bAuto = StringUtil.IsInList("auto", strDuoyinStyle); bool bFirst = StringUtil.IsInList("first", strDuoyinStyle); // string strSpecialChars = "!·#¥%……—*()——+-=[]《》<>,。?/\|{}“”‘’"; bool bNotFoundPinyin = false; // 是否出现过没有找到拼音、只能把汉字放入结果字符串的情况 string strHanzi; int nStatus = -1; // 前面一个字符的类型 -1:前面没有字符 0:普通英文字母 1:空格 2:汉字 for (int i = 0; i < strText.Length; i++) { char ch = strText[i]; strHanzi = ""; if (ch >= 0 && ch <= 128) { if (nStatus == 2) strPinyin += " "; strPinyin += ch; if (ch == ' ') nStatus = 1; else nStatus = 0; continue; } else { // 汉字 strHanzi += ch; } // 汉字前面出现了英文或者汉字,中间间隔空格 if (nStatus == 2 || nStatus == 0) strPinyin += " "; // 看看是否特殊符号 if (StringUtil.SpecialChars.IndexOf(strHanzi) != -1) { strPinyin += strHanzi; // 放在本应是拼音的位置 nStatus = 2; continue; } // 获得拼音 string strResultPinyin = ""; int nRet = 0; if (bLocal == true) { nRet = this.LoadQuickPinyin(true, out strError); if (nRet == -1) return -1; nRet = this.QuickPinyin.GetPinyin( strHanzi, out strResultPinyin, out strError); } else { throw new Exception("暂不支持从拼音库中获取拼音"); /* nRet = GetOnePinyin(strHanzi, out strResultPinyin, out strError); * */ } if (nRet == -1) return -1; if (nRet == 0) { // canceled strPinyin += strHanzi; // 只好将汉字放在本应是拼音的位置 nStatus = 2; continue; } Debug.Assert(strResultPinyin != "", ""); strResultPinyin = strResultPinyin.Trim(); if (strResultPinyin.IndexOf(";", 0) != -1) { // 如果是多个拼音 SelPinyinDlg dlg = new SelPinyinDlg(); //float ratio_single = dlg.listBox_multiPinyin.Font.SizeInPoints / dlg.Font.SizeInPoints; //float ratio_sample = dlg.textBox_sampleText.Font.SizeInPoints / dlg.Font.SizeInPoints; MainForm.SetControlFont(dlg, this.Font, false); // 维持字体的原有大小比例关系 //dlg.listBox_multiPinyin.Font = new Font(dlg.Font.FontFamily, ratio_single * dlg.Font.SizeInPoints, GraphicsUnit.Point); //dlg.textBox_sampleText.Font = new Font(dlg.Font.FontFamily, ratio_sample * dlg.Font.SizeInPoints, GraphicsUnit.Point); // 这个对话框比较特殊 MainForm.SetControlFont(dlg, this.Font, false); dlg.Text = "请选择汉字 '" + strHanzi + "' 的拼音 (来自本机)"; dlg.SampleText = strText; dlg.Offset = i; dlg.Pinyins = strResultPinyin; dlg.Hanzi = strHanzi; if (bFirst == true && string.IsNullOrEmpty(dlg.Pinyins) == false) { dlg.ResultPinyin = SelPinyinDlg.GetFirstPinyin(dlg.Pinyins); dlg.DialogResult = DialogResult.OK; } else { this.AppInfo.LinkFormState(dlg, "SelPinyinDlg_state"); dlg.ShowDialog(owner); this.AppInfo.UnlinkFormState(dlg); } Debug.Assert(DialogResult.Cancel != DialogResult.Abort, "推断"); if (dlg.DialogResult == DialogResult.Cancel) { strPinyin += strHanzi; bNotFoundPinyin = true; } else if (dlg.DialogResult == DialogResult.OK) { strPinyin += SelPinyinDlg.ConvertSinglePinyinByStyle( dlg.ResultPinyin, style); } else if (dlg.DialogResult == DialogResult.Abort) { return 0; // 用户希望整个中断 } else { Debug.Assert(false, "SelPinyinDlg返回时出现意外的DialogResult值"); } } else { // 单个拼音 strPinyin += SelPinyinDlg.ConvertSinglePinyinByStyle( strResultPinyin, style); } nStatus = 2; } if (bNotFoundPinyin == false) return 1; // 正常结束 return 2; // 结果字符串中有没有找到拼音的汉字 }
// 为了兼容以前的 API public int HanziTextToPinyin( bool bLocal, string strText, PinyinStyle style, out string strPinyin, out string strError) { return this.MainForm.HanziTextToPinyin( this, bLocal, strText, style, "", out strPinyin, out strError); }
// parameters: // strPrefix 要加入拼音子字段内容前部的前缀字符串。例如 {cr:NLC} 或 {cr:CALIS} // return: // -1 出错。包括中断的情况 // 0 正常 /// <summary> /// 为 MarcRecord 对象内的记录加拼音 /// </summary> /// <param name="record">MARC 记录对象</param> /// <param name="strCfgXml">拼音配置 XML</param> /// <param name="style">风格</param> /// <param name="strPrefix">前缀字符串。缺省为空</param> /// <param name="bAutoSel">是否自动选择多音字</param> /// <returns>-1: 出错。包括中断的情况; 0: 正常</returns> public int AddPinyin( MarcRecord record, string strCfgXml, PinyinStyle style = PinyinStyle.None, string strPrefix = "", bool bAutoSel = false) { string strError = ""; XmlDocument cfg_dom = new XmlDocument(); try { cfg_dom.LoadXml(strCfgXml); } catch (Exception ex) { strError = "strCfgXml装载到XMLDOM时出错: " + ex.Message; goto ERROR1; } string strRuleParam = ""; if (string.IsNullOrEmpty(strPrefix) == false) { string strCmd = StringUtil.GetLeadingCommand(strPrefix); if (string.IsNullOrEmpty(strCmd) == false && StringUtil.HasHead(strCmd, "cr:") == true) { strRuleParam = strCmd.Substring(3); } } MarcNodeList fields = record.select("field"); foreach (MarcField field in fields) { List<PinyinCfgItem> cfg_items = null; int nRet = GetPinyinCfgLine( cfg_dom, field.Name, field.Indicator, out cfg_items); if (nRet <= 0) continue; string strHanzi = ""; string strFieldPrefix = ""; // 2012/11/5 // 观察字段内容前面的 {} 部分 { string strCmd = StringUtil.GetLeadingCommand(field.Content); if (string.IsNullOrEmpty(strRuleParam) == false && string.IsNullOrEmpty(strCmd) == false && StringUtil.HasHead(strCmd, "cr:") == true) { string strCurRule = strCmd.Substring(3); if (strCurRule != strRuleParam) continue; } else if (string.IsNullOrEmpty(strCmd) == false) { strFieldPrefix = "{" + strCmd + "}"; } } // 2012/11/5 // 观察 $* 子字段 { MarcNodeList subfields = field.select("subfield[@name='*']"); // if (subfields.count > 0) { string strCurStyle = subfields[0].Content; if (string.IsNullOrEmpty(strRuleParam) == false && strCurStyle != strRuleParam) continue; else if (string.IsNullOrEmpty(strCurStyle) == false) { strFieldPrefix = "{cr:" + strCurStyle + "}"; } } } foreach (PinyinCfgItem item in cfg_items) { for (int k = 0; k < item.From.Length; k++) { if (item.From.Length != item.To.Length) { strError = "配置事项 fieldname='" + item.FieldName + "' from='" + item.From + "' to='" + item.To + "' 其中from和to参数值的字符数不等"; goto ERROR1; } string from = new string(item.From[k], 1); string to = new string(item.To[k], 1); // 删除已经存在的目标子字段 field.select("subfield[@name='" + to + "']").detach(); MarcNodeList subfields = field.select("subfield[@name='" + from + "']"); foreach (MarcSubfield subfield in subfields) { strHanzi = subfield.Content; if (DetailHost.ContainHanzi(strHanzi) == false) continue; string strSubfieldPrefix = ""; // 当前子字段内容本来具有的前缀 // 检查内容前部可能出现的 {} 符号 string strCmd = StringUtil.GetLeadingCommand(strHanzi); if (string.IsNullOrEmpty(strRuleParam) == false && string.IsNullOrEmpty(strCmd) == false && StringUtil.HasHead(strCmd, "cr:") == true) { string strCurRule = strCmd.Substring(3); if (strCurRule != strRuleParam) continue; // 当前子字段属于和strPrefix表示的不同的编目规则,需要跳过,不给加拼音 strHanzi = strHanzi.Substring(strPrefix.Length); // 去掉 {} 部分 } else if (string.IsNullOrEmpty(strCmd) == false) { strHanzi = strHanzi.Substring(strCmd.Length + 2); // 去掉 {} 部分 strSubfieldPrefix = "{" + strCmd + "}"; } string strPinyin = ""; #if NO // 把字符串中的汉字和拼音分离 // return: // -1 出错 // 0 用户希望中断 // 1 正常 if (string.IsNullOrEmpty(this.PinyinServerUrl) == true || this.ForceUseLocalPinyinFunc == true) { nRet = this.HanziTextToPinyin( this, true, // 本地,快速 strHanzi, style, out strPinyin, out strError); } else { // 汉字字符串转换为拼音 // 如果函数中已经MessageBox报错,则strError第一字符会为空格 // return: // -1 出错 // 0 用户希望中断 // 1 正常 nRet = this.SmartHanziTextToPinyin( this, strHanzi, style, bAutoSel, out strPinyin, out strError); } #endif nRet = this.GetPinyin( this, strHanzi, style, bAutoSel, out strPinyin, out strError); if (nRet == -1) { goto ERROR1; } if (nRet == 0) { strError = "用户中断。拼音子字段内容可能不完整。"; goto ERROR1; } string strContent = strPinyin; if (string.IsNullOrEmpty(strPrefix) == false) strContent = strPrefix + strPinyin; else if (string.IsNullOrEmpty(strSubfieldPrefix) == false) strContent = strSubfieldPrefix + strPinyin; subfield.after(MarcQuery.SUBFLD + to + strPinyin); } } } } return 0; ERROR1: if (string.IsNullOrEmpty(strError) == false) { if (strError[0] != ' ') MessageBox.Show(this, strError); } return -1; }
// 包装后的 汉字到拼音 函数 // parameters: // return: // -1 出错 // 0 用户中断选择 // 1 成功 public int HanziTextToPinyin(string strHanzi, bool bAutoSel, PinyinStyle style, // PinyinStyle.None, out string strPinyin, out string strError) { strError = ""; strPinyin = ""; int nRet = 0; // 把字符串中的汉字和拼音分离 // return: // -1 出错 // 0 用户希望中断 // 1 正常 if (string.IsNullOrEmpty(this.PinyinServerUrl) == true || this.ForceUseLocalPinyinFunc == true) { nRet = this.HanziTextToPinyin( this, true, // 本地,快速 strHanzi, style, out strPinyin, out strError); } else { // 汉字字符串转换为拼音 // 如果函数中已经MessageBox报错,则strError第一字符会为空格 // return: // -1 出错 // 0 用户希望中断 // 1 正常 nRet = this.SmartHanziTextToPinyin( this, strHanzi, style, bAutoSel, out strPinyin, out strError); } if (nRet == -1) return -1; if (nRet == 0) { strError = "用户中断。拼音子字段内容可能不完整。"; return 0; } return 1; }
// 2015/7/20 新函数 // 汉字字符串转换为拼音 // 这个函数会按照当前配置,自动决定使用下层的加拼音函数 // return: // -1 出错 // 0 用户希望中断 // 1 正常 /// <summary> /// 汉字字符串转换为拼音 /// </summary> /// <param name="owner">用于函数中 MessageBox 和对话框 的宿主窗口</param> /// <param name="strHanzi">输入字符串</param> /// <param name="style">转换为拼音的风格</param> /// <param name="strDuoyinStyle">处理多音字的风格</param> /// <param name="strPinyin">返回拼音字符串</param> /// <param name="strError">返回出错信息</param> /// <returns>-1: 出错; 0: 用户希望中断; 1: 正常; 2: 结果字符串中有没有找到拼音的汉字</returns> public int GetPinyin( IWin32Window owner, string strHanzi, PinyinStyle style, string strDuoyinStyle, // bool bAutoSel, out string strPinyin, out string strError) { strError = ""; // return: // -1 出错 // 0 用户希望中断 // 1 正常 if (string.IsNullOrEmpty(this.PinyinServerUrl) == true || this.ForceUseLocalPinyinFunc == true) { return this.HanziTextToPinyin( owner, true, // 本地,快速 strHanzi, style, strDuoyinStyle, out strPinyin, out strError); } else { // 汉字字符串转换为拼音 // 如果函数中已经MessageBox报错,则strError第一字符会为空格 // return: // -1 出错 // 0 用户希望中断 // 1 正常 return this.SmartHanziTextToPinyin( owner, strHanzi, style, strDuoyinStyle, out strPinyin, out strError); } }