Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Определение языка текста


Автор: Toohtik 30.11.2006, 00:58
Здраствуйте. Возникла задача в которой надо определить язык текста. Эту задачу я пытаюсь решить путем сравнения символов ASCII:
Код

bool Lang(char* readfile)
{
    int rus=0,en=0;
    int i=0;
    int k;
    k=strlen(readfile);
    for(i=0;i<k;i++)
    {        
        if((readfile[i]>127)&&(readfile[i]<176))
            rus++;

        if((readfile[i]>64)&&(readfile[i]<123))
            en++;
    }
    if(en>rus)
        return true;
    else
        return false;
}
 
Но в результате у меня считаются только английские символы. В чем может заключатся ошибка? Ести ли какие нибудь другие пути решения этой задачи? Можно даже функциями WinApi.

Автор: Sartorius 30.11.2006, 01:01
 Не в юникоде строчка то?

Автор: Toohtik 30.11.2006, 01:09
Честно говоря даже и не знаю. Сама программа написана на Api, она читает в readfile текстовый файл. А как определить Юникод или не Юникод?

Автор: satrap 30.11.2006, 02:34
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_langref_Data_Type_Ranges.asp
Цитата

char,
signed char  –128 to 127


Автор: codelord 30.11.2006, 02:43
Цитата(Toohtik @  29.11.2006,  21:09 Найти цитируемый пост)
 А как определить Юникод или не Юникод?

Открой Hex редактором если начало файла такое:
FFFE или EFBB то юникод
если нет то видимо нет.

ну или посчитай сколько символов если текст не большой (или посмотри с помощью текстового редактора),
юникод символ занимает 2 байта, т.е.
если например 20 символов то файл юникод будет весить 40 байт,
а обычный текст 20 байт.

ну или еще открой блокнотом и выбери сохранить как и сохрани как тебе нужно там можно выбрать.

Автор: peetonn 30.11.2006, 02:52
заметь:
у символа 'А' (русского) код 128
однако это неверно: 
если  
char a = 'А';
то
a == (char) 128; // вовсе не так!!!

Автор: Toohtik 30.11.2006, 20:22
Что значит начало? Открыл при помощи winhex в граффе offset - 00000 00000001.... т.е. FFFE или EFBB и не пахнет, а сама информация такого типа:E2 F2 EF... 
По размеру 16 букв - 18 байт

Автор: JackYF 30.11.2006, 21:08
В любом случае попробуй так:

bool Lang(char* readfile)
{
    int rus=0,en=0;
    int i=0;
    int k;
    k=strlen(readfile);
    for(i=0;i<k;++i)
    {        
        if((readfile[i]>'А')&&(readfile[i]<'я'))
            rus++;

        else if((readfile[i]>'A')&&(readfile[i]<'z'))
            en++;
    }
    if(en>rus)
        return true;
    else
        return false;
}

Автор: Toohtik 30.11.2006, 21:35
JackYF,  спасибо помогло!!!

Автор: Rockie 2.12.2006, 01:04
JackYF, символы в таблице ASCII не обязательно располагаются подряд (как в алфавите) и не идут цельным куском(в интервале от 'A' до 'z' еще попадают '\',  '[', ']' и тд)

Автор: JackYF 4.12.2006, 16:13
Rockie, не спорю.
Мое решение далеко не оптимальное. Оно есть второе, что приходит в голову...

В принципе, если мы проверяем текст, то частота встречаемости \ , [ , ] на порядок меньше частоты встречаемости английских и русских букв.
Если текст написан целиком на русском или английском языках, то ошибки, думаю, не будет. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)