2012-04-12 2 views
0

Что является самым простым/оптимальным способом преобразования AnsiString в кириллицу с использованием C++ STL!Функция 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»? (BTW, лучше, если вы дадите комментарии на английском языке.) – kennytm

+0

Я имею в виду кодировку String! например 'samiev' =' самиев' –

+0

ОК. Потому что ваш 'encodestring' выполняет преобразование' encodestring ('самиев') === 'samiev''. – kennytm

ответ

0

Наконец я написал мою собственную функ и она хорошо работает! Я думаю, что это выполнит мою работу, но не так оптимизировано! Пытался использовать map.find() smth вот так, но .....

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 
}; 
Смежные вопросы