2012-04-12 47 views
0

什麼是使用C++ STL將AnsiString轉換成西里爾語的最簡單/最優方法!函數latin2cyr或C++中的反過來

在PHP這將是

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

我更喜歡使用STL容器,需要幫助!

+0

將AnsiString轉換成西里爾語,意思是你想實現這個'encodestring'函數的* inverse *嗎? (順便說一句,如果你提供英語評論會更好。) – kennytm 2012-04-12 10:28:01

+0

我的意思是編碼字符串!例如'samiev' ='самиев' – 2012-04-12 10:29:44

+0

好的。因爲你的'encodestring'執行轉換'encodestring('самиев')==='samiev''。 – kennytm 2012-04-12 10:33:56

回答

0

最後,我寫我自己的FUNC鍵,它工作得很好!我認爲這會讓我的工作完成,但沒有那麼優化!試圖用map.find()水木清華這樣的,但是.....

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

任何想法來優化呢?

0

您也可以在C++中使用相同的代碼風格。看看std :: map容器。在最新的標準C++ 11你還可以在一個十分便利的方式將其初始化:

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