Матюгальник - проблемы с чтением русского текста из потока

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Atrill, 21 Jul 2009.

  1. Atrill

    Atrill New Member

    Joined:
    14 May 2009
    Messages:
    7
    Likes Received:
    0
    Reputations:
    0
    Привет. Вот описание моей проги:
    Code:
    /**
     * matygalnik (матюгальник)
     *
     * usage
     *  stdin | matyk | stdout
     * for example see how using grep command
     * используйте так же как комманду grep
     * заменяет некоторую часть слов на матерные
     *
     * скомпелируйте программу с опцией -D HTML=1 если хотите
     * конвертировать web-страницы
     *
     * author Atrill
     * version 0.7.4
     * copyright GPL 2
     * date 28.06.2009
     */
    Проблема в том, что я не могу прочитать поток функцией getc в никсах, т.к. там с кодировкой непонятно что. Думал что каждый символ нормально занимает 2 байта - нет. Одни символы занимают 1 байт, а другие 2. Пока всё работает, но всё же хотелось бы читать поток через getc отдельными символами.
    Кто-нибудь подскажет как это сделать? Исходники прилагаются.

    http://rapidshare.com/files/258286776/matyuk.tar.gz.html
    MD5: E066B1111559B1FD939CDEEC6B45254B
     
    #1 Atrill, 21 Jul 2009
    Last edited: 21 Jul 2009
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Скорее всего там кодировка UTF-8 в которой русские символы кодируются 2-мя байтами, а англ - одним. Так что считывай 1 символ. если это UTF8 то считывай второй символ и декодируй в один.
     
  3. Atrill

    Atrill New Member

    Joined:
    14 May 2009
    Messages:
    7
    Likes Received:
    0
    Reputations:
    0
    Как я могу узнать когда следующий символ занимает два байта? В никсах каждый раз по разному, например, "." - занимает один байт, а "ф" - два.
     
  4. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    все символы с кодом > 0x7F кодируются двумя байтами.
    т.е. считываешь 1 символ. Если его код < 0x80 то символ таким и остаются.
    В противном случае считываешь второй символ и эти 2 символа конвертиш из UTF-8 в ANSI
     
  5. Atrill

    Atrill New Member

    Joined:
    14 May 2009
    Messages:
    7
    Likes Received:
    0
    Reputations:
    0
    Огромное спасибо. Пригодится, ведь, не только для матерящихся программ. +1
     
  6. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    эмм такие строки подходят под определение мультибайтовых... в общем крайне неудобная штука
    вот одно обсуждение нашел http://www.linux.org.ru/view-message.jsp?msgid=3035365
    в php с такими строками работашь как mb_*(); в windows MultiByteToWideChar и тд... а вот в unix я еще не писал хех
     
    _________________________