Comment convertir des caractères chinois en Pinyin
pour trier le texte en chinois, je veux convertir les caractères chinois en Pinyin, séparer correctement chaque caractère chinois et regrouper les caractères successifs ensemble.
pouvez-vous s'il vous plaît m'aider dans cette tâche en fournissant la logique ou le code source pour le faire?
s'il vous Plaît laissez-moi savoir si tout open source ou lib déjà présent pour cette.
7 réponses
courte réponse: vous ne le faites pas.
longue réponse: il n'y a pas de mappage entre un et un. Juste quelques exemples rapides:
- փ Peut être " ba " dans le troisième ton ou le quatrième ton.
- le " le "toneless ou" liao " third tone.
- que peut être "le" ou "yue", tous les deux dans le quatrième ton.
- Chan peut être "luo", "la" ou "lao", tout dans le quatrième ton.
Et ainsi de suite. J'ai un débutant livre sur ce sujet comportant 207 exemples. Je tiens à souligner que c'est un débutant livre, et n'est certainement pas complète. Chacun a une page ou deux exemples d'utilisation et des conditions dans lesquelles vous choisissez la prononciation. Il n'est pas quelque chose qui peut être facilement programmé (si).
et cela ne répond même pas à l'autre chose glissante que vous voulez traiter: la séparation des caractères en mots groupés. La notion même d'un mot est un peu glissante Chinois. (Il y a deux termes qui correspondent, grosso modo au "mot" en chinois par exemple: le " MIS "et le "mis". Le premier est le caractère, le deuxième groupe de caractères qui sont réunis dans un concept. (Les Chinois me demandent souvent combien de" mots "je peux lire quand ils signifient vraiment"caractères".), Alors que dans certains cas, la distinction est claire (le 词 "乌鸦", par exemple, est "corbeau" - les deux 字 doivent être réunies pour exprimer l'idée correctement et il serait incorrect de le traduire "corbeau noir"), dans d'autres il n'est pas si clair. Qu'est-ce que" փփ " traduit à? Est-ce un mot qui signifie idiomatiquement "bonjour"? Ou est-ce deux mots à traduire littéralement "bien"? Chacun des personnages impliqués se tient seul ou en groupe avec d'autres mots, mais ensemble ils signifient quelque chose entièrement différent de leurs significations individuelles. Compte tenu de cela, comment, précisément, avez-vous l'intention de grouper les translittérations du PCI (qui sont difficiles à impossible d'obtenir la bonne place en premier lieu!) dans "les mots"?
Un tableau contenant la correspondance entre unicode pour pinyin
ftp://ftp.cuhk.hk/pub/chinese/ifcss/software/data/Uni2Pinyin.gz
CoreFoundation fournit une certaine méthode pour faire la conversion:
CFMutableStringRef string = CFStringCreateMutableCopy(NULL, 0, CFSTR("中文"));
CFStringTransform(string, NULL, kCFStringTransformMandarinLatin, NO);
CFStringTransform(string, NULL, kCFStringTransformStripDiacritics, NO);
NSLog(@"%@", string);
La sortie est
zhong wen
l'écriture de code suivante en C# peut vous aider à convertir simplement les mots chinois qui incluent dans gb2312 encodec (seulement 2312 des mots chinois simplifiés souvent utilisés) en pinyin.comme convertir "fille " en" jintiantianqibucuo".
parfois, un mot chinois n'est pas celui d'une carte à une pinyin,ça dépend du contexte, nous parlons.comme le "行" dans "自行车"(vélo) est prononcé "Xing",mais dans "银行"(banque), il se prononce "Accrocher".donc, si vous avez un problème avec cela,vous pouvez trouver plus complexes solution pour gérer cela.
désolé pour mon mauvais anglais.j'espère que cela pourrait vous donner un peu d'aide.
public class ChineseToPinYin
{
private static int[] pyValue = new int[]
{
-20319,-20317,-20304,-20295,-20292,-20283,-20265,-20257,-20242,-20230,-20051,-20036,
-20032,-20026,-20002,-19990,-19986,-19982,-19976,-19805,-19784,-19775,-19774,-19763,
-19756,-19751,-19746,-19741,-19739,-19728,-19725,-19715,-19540,-19531,-19525,-19515,
-19500,-19484,-19479,-19467,-19289,-19288,-19281,-19275,-19270,-19263,-19261,-19249,
-19243,-19242,-19238,-19235,-19227,-19224,-19218,-19212,-19038,-19023,-19018,-19006,
-19003,-18996,-18977,-18961,-18952,-18783,-18774,-18773,-18763,-18756,-18741,-18735,
-18731,-18722,-18710,-18697,-18696,-18526,-18518,-18501,-18490,-18478,-18463,-18448,
-18447,-18446,-18239,-18237,-18231,-18220,-18211,-18201,-18184,-18183, -18181,-18012,
-17997,-17988,-17970,-17964,-17961,-17950,-17947,-17931,-17928,-17922,-17759,-17752,
-17733,-17730,-17721,-17703,-17701,-17697,-17692,-17683,-17676,-17496,-17487,-17482,
-17468,-17454,-17433,-17427,-17417,-17202,-17185,-16983,-16970,-16942,-16915,-16733,
-16708,-16706,-16689,-16664,-16657,-16647,-16474,-16470,-16465,-16459,-16452,-16448,
-16433,-16429,-16427,-16423,-16419,-16412,-16407,-16403,-16401,-16393,-16220,-16216,
-16212,-16205,-16202,-16187,-16180,-16171,-16169,-16158,-16155,-15959,-15958,-15944,
-15933,-15920,-15915,-15903,-15889,-15878,-15707,-15701,-15681,-15667,-15661,-15659,
-15652,-15640,-15631,-15625,-15454,-15448,-15436,-15435,-15419,-15416,-15408,-15394,
-15385,-15377,-15375,-15369,-15363,-15362,-15183,-15180,-15165,-15158,-15153,-15150,
-15149,-15144,-15143,-15141,-15140,-15139,-15128,-15121,-15119,-15117,-15110,-15109,
-14941,-14937,-14933,-14930,-14929,-14928,-14926,-14922,-14921,-14914,-14908,-14902,
-14894,-14889,-14882,-14873,-14871,-14857,-14678,-14674,-14670,-14668,-14663,-14654,
-14645,-14630,-14594,-14429,-14407,-14399,-14384,-14379,-14368,-14355,-14353,-14345,
-14170,-14159,-14151,-14149,-14145,-14140,-14137,-14135,-14125,-14123,-14122,-14112,
-14109,-14099,-14097,-14094,-14092,-14090,-14087,-14083,-13917,-13914,-13910,-13907,
-13906,-13905,-13896,-13894,-13878,-13870,-13859,-13847,-13831,-13658,-13611,-13601,
-13406,-13404,-13400,-13398,-13395,-13391,-13387,-13383,-13367,-13359,-13356,-13343,
-13340,-13329,-13326,-13318,-13147,-13138,-13120,-13107,-13096,-13095,-13091,-13076,
-13068,-13063,-13060,-12888,-12875,-12871,-12860,-12858,-12852,-12849,-12838,-12831,
-12829,-12812,-12802,-12607,-12597,-12594,-12585,-12556,-12359,-12346,-12320,-12300,
-12120,-12099,-12089,-12074,-12067,-12058,-12039,-11867,-11861,-11847,-11831,-11798,
-11781,-11604,-11589,-11536,-11358,-11340,-11339,-11324,-11303,-11097,-11077,-11067,
-11055,-11052,-11045,-11041,-11038,-11024,-11020,-11019,-11018,-11014,-10838,-10832,
-10815,-10800,-10790,-10780,-10764,-10587,-10544,-10533,-10519,-10331,-10329,-10328,
-10322,-10315,-10309,-10307,-10296,-10281,-10274,-10270,-10262,-10260,-10256,-10254
};
private static string[] pyName = new string[]
{
"A","Ai","An","Ang","Ao","Ba","Bai","Ban","Bang","Bao","Bei","Ben",
"Beng","Bi","Bian","Biao","Bie","Bin","Bing","Bo","Bu","Ba","Cai","Can",
"Cang","Cao","Ce","Ceng","Cha","Chai","Chan","Chang","Chao","Che","Chen","Cheng",
"Chi","Chong","Chou","Chu","Chuai","Chuan","Chuang","Chui","Chun","Chuo","Ci","Cong",
"Cou","Cu","Cuan","Cui","Cun","Cuo","Da","Dai","Dan","Dang","Dao","De",
"Deng","Di","Dian","Diao","Die","Ding","Diu","Dong","Dou","Du","Duan","Dui",
"Dun","Duo","E","En","Er","Fa","Fan","Fang","Fei","Fen","Feng","Fo",
"Fou","Fu","Ga","Gai","Gan","Gang","Gao","Ge","Gei","Gen","Geng","Gong",
"Gou","Gu","Gua","Guai","Guan","Guang","Gui","Gun","Guo","Ha","Hai","Han",
"Hang","Hao","He","Hei","Hen","Heng","Hong","Hou","Hu","Hua","Huai","Huan",
"Huang","Hui","Hun","Huo","Ji","Jia","Jian","Jiang","Jiao","Jie","Jin","Jing",
"Jiong","Jiu","Ju","Juan","Jue","Jun","Ka","Kai","Kan","Kang","Kao","Ke",
"Ken","Keng","Kong","Kou","Ku","Kua","Kuai","Kuan","Kuang","Kui","Kun","Kuo",
"La","Lai","Lan","Lang","Lao","Le","Lei","Leng","Li","Lia","Lian","Liang",
"Liao","Lie","Lin","Ling","Liu","Long","Lou","Lu","Lv","Luan","Lue","Lun",
"Luo","Ma","Mai","Man","Mang","Mao","Me","Mei","Men","Meng","Mi","Mian",
"Miao","Mie","Min","Ming","Miu","Mo","Mou","Mu","Na","Nai","Nan","Nang",
"Nao","Ne","Nei","Nen","Neng","Ni","Nian","Niang","Niao","Nie","Nin","Ning",
"Niu","Nong","Nu","Nv","Nuan","Nue","Nuo","O","Ou","Pa","Pai","Pan",
"Pang","Pao","Pei","Pen","Peng","Pi","Pian","Piao","Pie","Pin","Ping","Po",
"Pu","Qi","Qia","Qian","Qiang","Qiao","Qie","Qin","Qing","Qiong","Qiu","Qu",
"Quan","Que","Qun","Ran","Rang","Rao","Re","Ren","Reng","Ri","Rong","Rou",
"Ru","Ruan","Rui","Run","Ruo","Sa","Sai","San","Sang","Sao","Se","Sen",
"Seng","Sha","Shai","Shan","Shang","Shao","She","Shen","Sheng","Shi","Shou","Shu",
"Shua","Shuai","Shuan","Shuang","Shui","Shun","Shuo","Si","Song","Sou","Su","Suan",
"Sui","Sun","Suo","Ta","Tai","Tan","Tang","Tao","Te","Teng","Ti","Tian",
"Tiao","Tie","Ting","Tong","Tou","Tu","Tuan","Tui","Tun","Tuo","Wa","Wai",
"Wan","Wang","Wei","Wen","Weng","Wo","Wu","Xi","Xia","Xian","Xiang","Xiao",
"Xie","Xin","Xing","Xiong","Xiu","Xu","Xuan","Xue","Xun","Ya","Yan","Yang",
"Yao","Ye","Yi","Yin","Ying","Yo","Yong","You","Yu","Yuan","Yue","Yun",
"Za", "Zai","Zan","Zang","Zao","Ze","Zei","Zen","Zeng","Zha","Zhai","Zhan",
"Zhang","Zhao","Zhe","Zhen","Zheng","Zhi","Zhong","Zhou","Zhu","Zhua","Zhuai","Zhuan",
"Zhuang","Zhui","Zhun","Zhuo","Zi","Zong","Zou","Zu","Zuan","Zui","Zun","Zuo"
};
/// <summary>
/// 把汉字转换成拼音(全拼)
/// </summary>
/// <param name="hzString">汉字字符串</param>
/// <returns>转换后的拼音(全拼)字符串</returns>
public static string Convert(string hzString)
{
// 匹配中文字符
Regex regex = new Regex("^[\u4e00-\u9fa5]$");
byte[] array = new byte[2];
string pyString = "";
int chrAsc = 0;
int i1 = 0;
int i2 = 0;
char[] noWChar = hzString.ToCharArray();
for (int j = 0; j < noWChar.Length; j++)
{
// 中文字符
if (regex.IsMatch(noWChar[j].ToString()))
{
array = System.Text.Encoding.Default.GetBytes(noWChar[j].ToString());
i1 = (short)(array[0]);
i2 = (short)(array[1]);
chrAsc = i1 * 256 + i2 - 65536;
if (chrAsc > 0 && chrAsc < 160)
{
pyString += noWChar[j];
}
else
{
// 修正部分文字
if (chrAsc == -9254) // 修正“圳”字
pyString += "Zhen";
else
{
for (int i = (pyValue.Length - 1); i >= 0; i--)
{
if (pyValue[i] <= chrAsc)
{
pyString += pyName[i];
break;
}
}
}
}
}
// 非中文字符
else
{
pyString += noWChar[j].ToString();
}
}
return pyString;
}
}
@juste la réponse de mon OPINION correcte répond à certaines des difficultés de conversion des caractères en pinyin, ce n'est pas un problème impossible à résoudre.
j'ai écrit une bibliothèque (pinyinify) cela résout cette tâche avec une précision décente. Même s'il n'y a pas de correspondance entre les caractères et le pinyin, Ma bibliothèque peut généralement décider quelle prononciation est correcte. Par exemple, "我受不了了" convertit correctement "wǒ le shòubùliǎo", avec deux prononciations différentes de la composition.
Mon approche pour résoudre le problème est assez simple:
- Premier segment du texte en mots. Par exemple, l'option d'achat se diviserait en trois mots: l'option d'achat. Ce n'est pas non plus un processus simple, mais il existe de nombreuses bibliothèques pour cela. jieba est l'une des bibliothèques les plus populaires à cette fin.
- Utiliser un dictionnaire pour convertir les mots en pinyin.
- Si le mot n'est pas dans le dictionnaire, revenir à la conversion des caractères individuels en pinyin en utilisant leur prononciation la plus commune.
j'ai eu ce problème et j'ai trouvé une solution en PHP (qui pourrait être plus propre je suppose mais cela fonctionne). J'ai eu quelques problèmes parce que le fichier donné dans ce sujet est de hexa unicode.
1) Importer les données de ftp://ftp.cuhk.hk/pub/chinese/ifcss/software/data/Uni2Pinyin.gz (merci pierr) à votre base de données ou peu importe
2) Importer vos données dans un tableau $pinyinArray[$hexaUnicode] = $pinyin;
3) Utilisez ce code:
/*
* Decimal representation of $c
* function found there: http://www.cantonese.sheik.co.uk/phorum/read.php?2,19594
*/
function uniord($c)
{
$ud = 0;
if (ord($c{0})>=0 && ord($c{0})<=127)
$ud = $c{0};
if (ord($c{0})>=192 && ord($c{0})<=223)
$ud = (ord($c{0})-192)*64 + (ord($c{1})-128);
if (ord($c{0})>=224 && ord($c{0})<=239)
$ud = (ord($c{0})-224)*4096 + (ord($c{1})-128)*64 + (ord($c{2})-128);
if (ord($c{0})>=240 && ord($c{0})<=247)
$ud = (ord($c{0})-240)*262144 + (ord($c{1})-128)*4096 + (ord($c{2})-128)*64 + (ord($c{3})-128);
if (ord($c{0})>=248 && ord($c{0})<=251)
$ud = (ord($c{0})-248)*16777216 + (ord($c{1})-128)*262144 + (ord($c{2})-128)*4096 + (ord($c{3})-128)*64 + (ord($c{4})-128);
if (ord($c{0})>=252 && ord($c{0})<=253)
$ud = (ord($c{0})-252)*1073741824 + (ord($c{1})-128)*16777216 + (ord($c{2})-128)*262144 + (ord($c{3})-128)*4096 + (ord($c{4})-128)*64 + (ord($c{5})-128);
if (ord($c{0})>=254 && ord($c{0})<=255) //error
$ud = false;
return $ud;
}
/*
* Translate the $string string of a single chinese charactere to unicode
*/
function chineseToHexaUnicode($string) {
return strtoupper(dechex(uniord($string)));
}
/*
*
*/
function convertChineseToPinyin($string,$pinyinArray) {
$pinyinValue = '';
for ($i = 0; $i < mb_strlen($string);$i++)
$pinyinValue.=$pinyinArray[chineseToHexaUnicode(mb_substr($string, $i, 1))];
return $pinyinValue;
}
$string = '龙江省五大';
echo convertChineseToPinyin($string,$pinyinArray);
echo: (long2)(jiang1)(sheng3,xing3)(wu3)(da4,dai4)
bien sûr, $pinyinArray
est votre tableau de données (hexoUnicode => pinyin
)
j'Espère que ça aidera quelqu'un.
si vous utilisez Visual Studio, cela pourrait être une option:
Microsoft.International.Convertisseur.PinYinConverter
comment installer:
tout d'abord, téléchargez le Visual Studio International Pack 2.0, téléchargement officiel. Une fois le téléchargement terminé, installez le fichier run VSIPSetup.installation msi (système d'exploitation x86 sur le répertoire d'installation par défaut (C:\Program fichiers\Microsoft Visual Studio International Feature Pack 2.0). Après installation, vous devez ajouter une référence dans VS, respectivement référence: C:\Program Fichiers\Microsoft Visual Studio International Pack\Simplified Chinese Pin-Yin Conversion Library (Pinyin) et C:\Program fichiers\Microsoft Visual Studio International Pack\Traditionnel Chinois à simplifié bibliothèque de Conversion chinois et L'outil D'ajout (traditionnel et simplifié Huzhuan to)
Comment utilisation:
public static string GetPinyin(string str)
{
string r = string.Empty;
foreach (char obj in str)
{
try
{
ChineseChar chineseChar = new ChineseChar(obj);
string t = chineseChar.Pinyins[0].ToString();
r += t.Substring(0, t.Length - 1);
}
catch
{
r += obj.ToString();
}
}
return r;
}