2012-04-12 9 views
0

Was ist der einfachste/optimale Weg, um AnsiString mit C++ STL in Kyrillisch umzuwandeln?Funktion latin2cyr oder umgekehrt in C++

in PHP wäre es

sein
<?php 
    // функция превода текста с кириллицы в траскрипт 
    function encodestring($st) 
    { 
    // Сначала заменяем "односимвольные" фонемы. 
    $st=strtr($st,"абвгдеёзийклмнопрстуфхъыэ_", 
    "abvgdeeziyklmnoprstufh'iei"); 
    $st=strtr($st,"АБВГДЕЁЗИЙКЛМНОПРСТУФХЪЫЭ_", 
    "ABVGDEEZIYKLMNOPRSTUFH'IEI"); 
    // Затем - "многосимвольные". 
    $st=strtr($st, 
        array(
         "ж"=>"zh", "ц"=>"ts", "ч"=>"ch", "ш"=>"sh", 
         "щ"=>"shch","ь"=>"", "ю"=>"yu", "я"=>"ya", 
         "Ж"=>"ZH", "Ц"=>"TS", "Ч"=>"CH", "Ш"=>"SH", 
         "Щ"=>"SHCH","Ь"=>"", "Ю"=>"YU", "Я"=>"YA", 
         "ї"=>"i", "Ї"=>"Yi", "є"=>"ie", "Є"=>"Ye" 
         ) 
      ); 
    // Возвращаем результат. 
    return $st; 
    } 
?> 

Ich ziehe STL Container zu verwenden, die Hilfe benötigen!

+0

Transformieren Sie AnsiString in kyrillisch, was bedeutet, dass Sie das * inverse * dieser 'encodestring' Funktion implementieren möchten? (BTW, es ist besser, wenn Sie die Kommentare in Englisch bereitstellen.) – kennytm

+0

Ich meine Codierung String! z.B. 'samiev' =' самиев' –

+0

OK. Weil Ihre 'encodestring' die Transformation' encodestring ('самиев ') ===' samiev'' ausführt. – kennytm

Antwort

0

Schließlich schrieb ich meine eigene func und es funktioniert gut! Ich denke, es wird meine Arbeit erledigen, aber nicht so optimiert! Versucht, map.find() smth zu verwenden, aber .....

AnsiString Latin2Cyr(AnsiString inStr) 
{ 
    int l=inStr.Length(); 
    if (!l) return ""; 

    AnsiString strLat[]={"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"}; 
    AnsiString strCyr[]={"а","б","с","д","е","ф","г","х","и","дж","к","л","м","н","о","п","к","р","с","т","у","в","у","кс","й","з"}; 
    AnsiString outStr=""; 
    typedef multimap<AnsiString,AnsiString> mmp; 
    mmp mStr; 
    int ln=(sizeof(strLat))/(sizeof(AnsiString)); 
    for (int i = 0; i < ln; i++) mStr.insert(mmp::value_type(strLat[i],strCyr[i])); 
    AnsiString k=""; mmp::iterator it; 
    for (int j = 1; j <l+1; j++) { 
     for (it=mStr.begin(); it!= mStr.end();++it){ 
      outStr+=((*it).first==inStr.SubString(j,1))? (*it).second : k ; 
     } 
    } 
    return outStr; 
} 

irgendwelche Ideen, um es zu optimieren?

0

Sie können den gleichen Code-Stil auch in C++ verwenden. Suchen Sie nach dem Container std :: map. In neuesten Standards sind C 11 ++ Sie auch in der Lage es in eine sehr praktisch Art und Weise zu initialisieren:

map letters = 
{{ "f", "ф"}, 
    { "h", "х"}, 
    //and so on 
}; 
Verwandte Themen