如何在C#中将拼音字符串转换为中文

8
我在我的WPF应用程序中有一个触摸屏键盘,我想允许用户用中文书写。
我看到Windows中有一个IME可以使用拼音写入中文。它很好用,但是我想为我的WPF应用程序进行定制(特别是候选列表)。我没有找到任何相关的文档。
我的想法是用户使用虚拟键盘用拼音输入,然后在文本框旁边会出现一份包含汉字选择的列表。
你有什么建议实现这个功能?也许有一个库(不是来自Microsoft),可以完成它,如果是这种情况,我就不会使用MS的IME了。

如果是基于触摸的输入,让用户在屏幕上“写字”而不是使用拼音转换,这样岂不是更好? - Szabolcs
触摸屏不太灵敏,很难在小文本框中书写。这是为医疗应用而设计的,因此医生们可以创建新患者,并通过他们的姓名、名字等查找他们。这就是为什么不能实现您的解决方案。 - Rodrigue Rens
所以你想自定义候选列表是为了自动完成病人的名字?我知道的大多数程序实现这个功能的方式是允许直接输入拼音(不通过系统输入法),并基于此进行自动完成。这个问题比实现通用和有效的输入法要容易得多——通用输入法必须处理所有字符,并建议最可能的匹配。最新的微软拼音输入法甚至可以从互联网自动更新最新的统计数据以改善预测,并且它也会从用户那里学习。 - Szabolcs
所以作为一个简单的解决方法,你可以让他们要么输入罗马字母(直接拼音),并在字符名称上建议匹配项,也可以让他们通过IME进行输入,就像在常规桌面操作系统上一样。当然,这并不像在IME中提供自动补全那样好,但应该是相当可用的。 - Szabolcs
感谢您的建议,Szabolcs。我想自定义MS IME的候选列表是为了让它与应用程序具有相同的主题。(该列表将出现在键盘旁边)。不仅有名字和姓氏,还有关于患者的评论。我认为用户可以插入中文汉字而不是拼音会更好。我可以使用ImmGetCandidateList函数获取列表,但我能否使用imm32.dll的函数修改列表样式呢? - Rodrigue Rens
2个回答

4

谢谢Lex Li, 我之前已经下载了这个包,但是我没有看到有关如何将拼音字符串转换为汉字的任何内容。我应该使用哪个函数? - Rodrigue Rens
1
我认为最好提到整个命名空间,即Microsoft.International.Converters.PinYinConverter。而且,现在更容易通过NuGet获取:https://www.nuget.org/packages/Microsoft.International.Converters.PinYinConverter/ - Yoav Feuerstein
1
请运行我粘贴的代码片段,以了解“拼音”的确切格式,然后您就会知道feng是无效的,因此应该期望null。您应该使用FENG1或其他有效的输入。 - Lex Li
@LexLi 谢谢!但是,考虑到用户只输入了“feng”,我想显示所有可能匹配它的中文字符,我应该只是附加一个数字(1、2、3或4),然后查看从每个数字的GetChars()方法中获取什么? (根据此讨论,我假设没有超过4个可能的数字:https://www.quora.com/Why-are-there-numbers-in-the-Chinese-Pinyin) - Yoav Feuerstein
1
@YoavFeuerstein 我没有答案。你可以查看这个汇编代码(以及它的资源文件)来获得更多的见解。 - Lex Li
显示剩余5条评论

3

不确定是否有任何开源软件包可用。然而,理论上建立这种库并不太难。在中文中,大约有1300个单独的音节:声母 + 韵母 + 声调。每个音节都有一组汉字,数量从1到130个不等。

您可以定义一个包含所有拼音音节的数组:

string[] pinyins = new string[] {
  "a:c1c2c3...",      // pinyin 1 a: character1 character2...
  ...
  "zuo:z1z2z3z4z5..." // last pinyin (1300) zuo: character character...
};

上面的数组是将拼音映射到中文的基础(中文字符和拼音音调都是Unicode字符串)。然后,对于每个拼音输入声音,可以通过以下函数获得字符列表:

string getCharacters(string aPinyin) {
   string characters = null;
   foreach(string item in pinyins) {
      string[] temp = item.split(':');
      if (temp[0].Equals(aPinyin)) {
          charaters = temp[1];
          break;
      }
   }
   return characters;
}

我很久以前写了一段JavaScript代码,定义了拼音和汉字之间的关系。在我的博客“从汉字获取拼音”中,可以通过查看源代码或在上下文菜单中检查元素找到该脚本。在我的博客中,该脚本用于将汉字转换为拼音,但是这种关系也可以用作参考。
要添加智能拼音功能——显示拼音单词列表,可以通过类似模式pinyin:words定义所有常用单词来实现。

嗨,大卫, 谢谢你的回答。你认为用户能够使用这个字典书写所有想要表达的内容吗?我指的是基本的东西,像他们的姓氏、名字、医学检查的评论之类的。 - Rodrigue Rens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接