<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: C++ Разбивка строки с кириллицей</title>
    <link>https://m.opennet.dev/openforum/vsluhforumID9/7654.html</link>
    <description>Имеется небольшая программа, которая получает строки из файла и с определенного символа разбивает его выводя на экран, то что, соответственно, разбила. Но вывод у меня получается кривой, например:&lt;br&gt;&amp;#65533;С СПб Мегафон         1:00&lt;br&gt;Как победить такую проблему? Заранее спасибо.&lt;br&gt;&lt;br&gt;Код программы и содержимое текстового файлика ниже.&lt;br&gt;&lt;br&gt;&lt;br&gt;$less ./1.cpp&lt;br&gt;#include &amp;lt;iostream&amp;gt;&lt;br&gt;#include &amp;lt;fstream&amp;gt;&lt;br&gt;#include &amp;lt;string&amp;gt;&lt;br&gt;#include &amp;lt;vector&amp;gt;&lt;br&gt;using namespace std;&lt;br&gt;int main() &#123;&lt;br&gt;    vector&amp;lt;string&amp;gt; v;&lt;br&gt;    string str_t, str;&lt;br&gt;    char intchar;&lt;br&gt;    ifstream in (&quot;1.txt&quot;); //Открываем поток для файла&lt;br&gt;    while (in.get(intchar)) &#123; //Читаем посимвольно&lt;br&gt;        if (intchar == &apos;&#092;n&apos;) &#123; //Если символ является переводом строки то ..&lt;br&gt;            v.push_back(str); // добавляем строку в массив&lt;br&gt;            str.erase(); // отчищаем строку&lt;br&gt;        &#125; else &#123;&lt;br&gt;            str += intchar; //иначе добавляем символы в строку&lt;br&gt;        &#125;;&lt;br&gt;    &#125;;&lt;br&gt;    in.close(); // Заканчиваем работу с файлом&lt;br&gt;    for (unsigned int i=0; i&amp;lt;v.size(); i++) &#123;&lt;br&gt;</description>

<item>
    <title>забивка строки с ++ (Heretic)</title>
    <link>https://m.opennet.dev/openforum/vsluhforumID9/7654.html#14</link>
    <pubDate>Mon, 17 Nov 2008 14:20:40 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;Спасибо за ответ, но мне бы в c++ виде =) ибо там &lt;br&gt;&amp;gt;&amp;gt;&amp;gt;не только, те строки что в примере. &lt;br&gt;&amp;gt;&amp;gt;&lt;br&gt;&amp;gt;&amp;gt;Чтобы правильно разбивать строки utf8 надо с ним работать как с utf8 &lt;br&gt;&amp;gt;&amp;gt;а не как с char &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;А вот и нифига. Если требуется разбивка на слова (space,comma,semicolon-separated) или разбивка &lt;br&gt;&amp;gt;на строки по &#092;n, то никаких дополнительных знаний об том что &lt;br&gt;&amp;gt;это кодировка именно utf8 не надо. Просто работаеш как с однобайтной &lt;br&gt;&amp;gt;и паришся - в этом и сила utf8. &lt;br&gt;&lt;br&gt;Я собственно так и сделал, по &quot; &quot; разбил и не стал заморачиваться.&lt;br&gt;Спасибо.&lt;br&gt;</description>
</item>

<item>
    <title>забивка строки с ++ (vertur)</title>
    <link>https://m.opennet.dev/openforum/vsluhforumID9/7654.html#13</link>
    <pubDate>Mon, 17 Nov 2008 12:49:12 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;Не за что. &lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;for (int k=51;k&amp;lt;=103;k++) &#123; &lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;    str_t+=v&#091;i&#093;&#091;k&#093;; &lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&#125;; &lt;br&gt;&amp;gt;&amp;gt;&lt;br&gt;&amp;gt;&amp;gt;Спасибо за ответ, но мне бы в c++ виде =) ибо там &lt;br&gt;&amp;gt;&amp;gt;не только, те строки что в примере. &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Чтобы правильно разбивать строки utf8 надо с ним работать как с utf8 &lt;br&gt;&amp;gt;а не как с char &lt;br&gt;&lt;br&gt;А вот и нифига. Если требуется разбивка на слова (space,comma,semicolon-separated) или разбивка на строки по &#092;n, то никаких дополнительных знаний об том что это кодировка именно utf8 не надо. Просто работаеш как с однобайтной и паришся - в этом и сила utf8.&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>C++ Разбивка строки с кириллицей (Heretic)</title>
    <link>https://m.opennet.dev/openforum/vsluhforumID9/7654.html#12</link>
    <pubDate>Fri, 17 Oct 2008 13:37:40 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;    &#125; &lt;br&gt;&amp;gt;    catch (exception &amp;e) &lt;br&gt;&amp;gt;    &#123; &lt;br&gt;&amp;gt;        wcerr &amp;lt;&amp;lt; L&quot;Опаньки эксепшен: &lt;br&gt;&amp;gt;&quot; &amp;lt;&amp;lt; e.what() &amp;lt;&amp;lt; endl; &lt;br&gt;&amp;gt;        return 1; &lt;br&gt;&amp;gt;    &#125; &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;    return 0; &lt;br&gt;&amp;gt;&#125; &lt;br&gt;&lt;br&gt;Спасибо, за помощь. Дальше буду думать уже сам.&lt;br&gt;</description>
</item>

<item>
    <title>C++ Разбивка строки с кириллицей (vic)</title>
    <link>https://m.opennet.dev/openforum/vsluhforumID9/7654.html#11</link>
    <pubDate>Fri, 17 Oct 2008 12:55:32 GMT</pubDate>
    <description>Заменим на работу с вайдами и станет проще:&lt;br&gt;#include &amp;lt;iostream&amp;gt;&lt;br&gt;#include &amp;lt;fstream&amp;gt;&lt;br&gt;#include &amp;lt;string&amp;gt;&lt;br&gt;#include &amp;lt;vector&amp;gt;&lt;br&gt;#include &amp;lt;locale&amp;gt; &lt;br&gt;#include &amp;lt;cstdlib&amp;gt;&lt;br&gt;&lt;br&gt;using namespace std; &lt;br&gt;&lt;br&gt;// эти параметры надо установить правильными исчисляя в символах, не в байтах.&lt;br&gt;const size_t FIRST_POS = 52; // ?&lt;br&gt;const size_t LEN_NAME = 103 - FIRST_POS;&lt;br&gt;&lt;br&gt;int main()&lt;br&gt;&#123; &lt;br&gt;    // устанавливаем локаль&lt;br&gt;    setlocale(LC_ALL, getenv(&quot;LANG&quot;));&lt;br&gt;    locale loc(getenv(&quot;LANG&quot;)); &lt;br&gt;&lt;br&gt;    wcout.imbue(loc); // локаль для потока вывода&lt;br&gt;&lt;br&gt;    try&lt;br&gt;    &#123;&lt;br&gt;        wfstream in(&quot;file.txt&quot;);&lt;br&gt;        in.imbue(loc); // локаль для потока ввода&lt;br&gt;&lt;br&gt;        // закидываем в массив&lt;br&gt;        vector&amp;lt;wstring&amp;gt; v;&lt;br&gt;        wstring s;&lt;br&gt;        while (getline(in, s)) v.push_back(s);&lt;br&gt;&lt;br&gt;        // выводим&lt;br&gt;        for (vector&amp;lt;wstring&amp;gt;::iterator it = v.begin(), et = v.end(); it != et; ++it)&lt;br&gt;        &#123;&lt;br&gt;            wcout &amp;lt;&amp;lt; it-&amp;gt;substr(FIRST_POS, LEN_NAME) &amp;lt;&amp;lt; endl;&lt;br&gt;        &#125;&lt;br&gt;    &#125;&lt;br&gt;    catch (exception &amp;e)&lt;br&gt;    &#123;&lt;br&gt;        wcerr &amp;lt;&amp;lt; L&quot;Опаньки эксепшен:</description>
</item>

<item>
    <title>C++ Разбивка строки с кириллицей (vic)</title>
    <link>https://m.opennet.dev/openforum/vsluhforumID9/7654.html#10</link>
    <pubDate>Fri, 17 Oct 2008 12:49:30 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;&amp;gt;Спасибо за ответ, ваша программа не заносила в массив строки (во всяком &lt;br&gt;&amp;gt;&amp;gt;случае у меня)&lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;это как? система у вас какая? &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;&amp;gt;одну строку, и разобрать ее я получил следующее: &lt;br&gt;&amp;gt;&amp;gt;&amp;#65533;С СПб Телеком 21      1:00 &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Проблема в первом символе как я понимаю? Так это зависит от локали &lt;br&gt;&amp;gt;и кодировки текста в файле. Какие они? &lt;br&gt;&lt;br&gt;Похоже у вас utf-8 в файле, а со строкой вы работаете считая что 1 символ = 1 байту, поэтому ваше начало подстроки (51) некорректно. в utf-8 русские буквы занимают 2 байта.&lt;br&gt;</description>
</item>

<item>
    <title>забивка строки с ++ (NuINu)</title>
    <link>https://m.opennet.dev/openforum/vsluhforumID9/7654.html#9</link>
    <pubDate>Fri, 17 Oct 2008 12:10:17 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;Чтобы правильно разбивать строки utf8 надо с ним работать как с utf8 &lt;br&gt;&amp;gt;&amp;gt;&amp;gt;а не как с char &lt;br&gt;&amp;gt;&amp;gt;&amp;gt;вот посмотрите: http://utfcpp.sourceforge.net/ &lt;br&gt;&amp;gt;&amp;gt;&lt;br&gt;&amp;gt;&amp;gt;Спасибо за статью, буду сейчас курить ее. &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Да если перевести как изначально было в CP-1251, то все нормально. Но &lt;br&gt;&amp;gt;я не как не могу понять, почему когда выводил всю строку &lt;br&gt;&amp;gt;было все ОК, а когда часть не отрабатывало? &lt;br&gt;&lt;br&gt;cp1251 это однобайтовый символ, с ним все будет работать.&lt;br&gt;&lt;br&gt;чего вам не понятно? вы разбиваете половину символа utf8, из за этого и знак вопроса.&lt;br&gt;ссылка показывает как я понял библиотеку, которая нормально решает проблемы с утф8, используйте ее.&lt;br&gt;</description>
</item>

<item>
    <title>C++ Разбивка строки с кириллицей (vic)</title>
    <link>https://m.opennet.dev/openforum/vsluhforumID9/7654.html#8</link>
    <pubDate>Fri, 17 Oct 2008 11:43:54 GMT</pubDate>
    <description>&amp;gt;&lt;br&gt;&amp;gt;Спасибо за ответ, ваша программа не заносила в массив строки (во всяком &lt;br&gt;&amp;gt;случае у меня)&lt;br&gt;&lt;br&gt;это как? система у вас какая?&lt;br&gt;&lt;br&gt;&amp;gt;одну строку, и разобрать ее я получил следующее: &lt;br&gt;&amp;gt;&amp;#65533;С СПб Телеком 21      1:00 &lt;br&gt;&lt;br&gt;Проблема в первом символе как я понимаю? Так это зависит от локали и кодировки текста в файле. Какие они?&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>забивка строки с ++ (Heretic)</title>
    <link>https://m.opennet.dev/openforum/vsluhforumID9/7654.html#7</link>
    <pubDate>Fri, 17 Oct 2008 11:42:03 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&#125;; &lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;Спасибо за ответ, но мне бы в c++ виде =) ибо там &lt;br&gt;&amp;gt;&amp;gt;&amp;gt;не только, те строки что в примере. &lt;br&gt;&amp;gt;&amp;gt;&lt;br&gt;&amp;gt;&amp;gt;Чтобы правильно разбивать строки utf8 надо с ним работать как с utf8 &lt;br&gt;&amp;gt;&amp;gt;а не как с char &lt;br&gt;&amp;gt;&amp;gt;вот посмотрите: http://utfcpp.sourceforge.net/ &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Спасибо за статью, буду сейчас курить ее. &lt;br&gt;&lt;br&gt;Да если перевести как изначально было в CP-1251, то все нормально. Но я не как не могу понять, почему когда выводил всю строку было все ОК, а когда часть не отрабатывало?&lt;br&gt;</description>
</item>

<item>
    <title>забивка строки с ++ (Heretic)</title>
    <link>https://m.opennet.dev/openforum/vsluhforumID9/7654.html#6</link>
    <pubDate>Fri, 17 Oct 2008 11:13:35 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;for (int k=51;k&amp;lt;=103;k++) &#123; &lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;    str_t+=v&#091;i&#093;&#091;k&#093;; &lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&#125;; &lt;br&gt;&amp;gt;&amp;gt;&lt;br&gt;&amp;gt;&amp;gt;Спасибо за ответ, но мне бы в c++ виде =) ибо там &lt;br&gt;&amp;gt;&amp;gt;не только, те строки что в примере. &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Чтобы правильно разбивать строки utf8 надо с ним работать как с utf8 &lt;br&gt;&amp;gt;а не как с char &lt;br&gt;&amp;gt;вот посмотрите: http://utfcpp.sourceforge.net/ &lt;br&gt;&lt;br&gt;Спасибо за статью, буду сейчас курить ее.&lt;br&gt;</description>
</item>

</channel>
</rss>
