2012-03-02 21 views
7

Tengo un teclado de pantalla táctil en mi aplicación WPF y me gustaría permitir que los usuarios escriban en chino.Cómo convertir una cadena de pinyin a chino en C#

Vi que hay un IME en Windows que permite escribir en chino con Pinyin. Funciona muy bien, pero me gustaría personalizarlo para mi aplicación WPF. (Especialmente la lista de candidatos). No encontré ninguna documentación para esto.

La idea será que el usuario escriba en Pinyin con el teclado virtual y habrá una lista de opciones con ideogramas chinos junto al cuadro de texto.

¿Tiene algún consejo para lograrlo? Tal vez haya una biblioteca (no de Microsoft) que pueda hacerlo y, en este caso, ¿no usaré el IME de MS?

+0

si es de entrada basada en el contacto, wouldn' ¿Es mejor dejar que ingresen caracteres "escribiendo" en la pantalla en lugar de usar la conversión pinyin? – Szabolcs

+0

La pantalla táctil no es realmente reactiva y no será fácil escribir en pequeños cuadros de texto. Es para una aplicación médica, por lo que los médicos tienen la posibilidad de crear nuevos pacientes y luego buscarlos por su nombre, nombre, etc. Por eso no pueden implementar su solución. –

+0

¿El motivo por el que desea personalizar la lista de candidatos es completar automáticamente el nombre del paciente? La forma en que la mayoría de los programas que conozco implementan esto es permitiendo escribir pinyin (directamente, no a través del sistema IME) y autocompletar en función de eso.Este problema es mucho más fácil que implementar un IME general y efectivo: un IME general debe manejar todos los caracteres y debe sugerir las coincidencias más probables. El más nuevo IME de MS pinyin incluso actualizaciones automáticas de Internet con las últimas estadísticas para mejorar las predicciones. y también aprende del usuario. – Szabolcs

Respuesta

3

http://www.microsoft.com/downloads/zh-cn/details.aspx?FamilyID=7D1DF9CE-4AEE-467F-996E-BEC826C5DAA2

http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=15251

Microsoft, de hecho, tiene buenos componentes/librerías para eso, sino que están escondidos aquí en el paquete de características de Visual Studio International.

Tenga en cuenta que necesita 1.0 SR 1 que proporciona las bibliotecas básicas, mientras que 2.0 agrega muchos controles WinForms o WPF.

(Actualizado el 26 de octubre de 2017. Muchos chicos han publicado en paquetes NuGet NuGet.org basado en el código de Microsoft, por lo que también puede ser que compruebe esos paquetes a cabo.)

+0

Gracias Lex Li, He descargado el paquete antes, pero no vi nada sobre cómo convertir una cadena de pinyin en ideogramas chinos. ¿Qué función debo usar? –

+0

Debería haber dejado en claro que necesita tanto 1.0 SR 1 como 2.0. CHSPinyinConv.msi en 1.0 SR1 es el de la conversión de Pinyin. ChineseChar.GetChars (cadena pinyin) puede ser tu punto de partida. –

+1

Creo que es mejor mencionar todo el espacio de nombres, que es 'Microsoft.International.Converters.PinYinConverter'. Además, es más fácil de obtener a través de NuGet hoy: https://www.nuget.org/packages/Microsoft.International.Converters.PinYinConverter/ –

2

No estoy seguro de si hay algún paquete de SO (Código abierto) disponible. Sin embargo, en teoría, no es demasiado difícil construir este tipo de biblioteca. En chino, hay alrededor de 1300 sonidos individuales: inicial + final + tonos. Cada sonido tiene un grupo de caracteres chinos, varios números de 1 a 130 caracteres.

Es posible definir una matriz de todos los sonidos de Pinyin:

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

La matriz anterior es una base para su asignación a Pinyin Chino (caracteres chinos y los tonos de Pinyin son cadenas Unicode). Luego, para cada sonido de entrada de Pinyin, una lista de caracteres se obtiene mediante una función como esta:

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; 
} 

que escribí hace mucho tiempo JavaScipt, donde he definido la relación entre Pinyin y los caracteres chinos. En mi blog: Get Pinyin From Chinese Characters, la secuencia de comandos se puede encontrar al ver los códigos fuente o Inspeccionar elemento en el menú contextual. En mi blog, el script se usa para convertir chino a pinyin, pero la relación se puede usar como referencia.

enter image description here

Para añadir inteligente función de Pinyin - muestra una lista de palabras para Pinyin, esto se puede hacer mediante la definición de todas las palabras que se usan comúnmente en el patrón similar: pinyin: palabras.

+0

Hola David, gracias por tu respuesta. ¿Crees que los usuarios podrán escribir todo lo que quieran con este dictionario? Me refiero a cosas básicas como su apellido, primer nombre, comentarios sobre un examen médico. –