Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определение длины строки std::string на русском 
:(
    Опции темы
Proger10
Дата 31.5.2013, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



Проблема возникает вот здесь:
Код

std::string str = "hello";
str.length() // 5

std::string str = "привет";
str.length() // 12

std::string str = "привет1";
str.length() // 13


Не очень понимаю каким образом считать количество букв. Оно мне считает количество байт видимо?

Компилятор: GCC, MacOS, кодировка: Unicode у нас(

Это сообщение отредактировал(а) Proger10 - 31.5.2013, 15:53
PM MAIL   Вверх
Proger10
Дата 31.5.2013, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



Использование wchar_t решает проблему:
Код

const wchar_t wtext[] = L"привет1" ;
wcslen( wtext ); // 7


А что обозначает буква "L" перед строкой? smile

Какие беды можно ожидать от такого решения при компиляции под разными операционками?

Это сообщение отредактировал(а) Proger10 - 31.5.2013, 16:27
PM MAIL   Вверх
bsa
Дата 31.5.2013, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Proger10 @  31.5.2013,  17:16 Найти цитируемый пост)
А что обозначает буква "L" перед строкой?

то что строка юникодовая (точнее, в расширенной кодировке).
С русским языком опять могут возникнуть проблемы, при компиляции программ в Windows. Рекомендую отказаться от использования кириллицы в тексте программы, а вместо этого читать из файла русификации (читай про gettext).
PM   Вверх
Proger10
Дата 31.5.2013, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



bsa 
По поводу кириллицы в коде - конечно, у меня такого не будет, это я для теста сейчас пробую. А есть ли возможность работать с кириллицей (во внешних текстовых файлах) без gettext? Насколько я понял, это сторонняя библиотека, хотелось бы как можно меньше зависимостей с собой тащить.

Мой проект: анализатор русскоязычного текста. Кодировка текстовых файлов: UTF-8. Есть ли возможность как-то стандартными средствами С++ поднимать этот текст и работать с ним (сортировать текст по алфавиту, искать вхождения букв, замерять длину текстовых подстрок), независимо от предпочтений операционки?)
PM MAIL   Вверх
Proger10
Дата 31.5.2013, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



В википедии: http://ru.wikipedia.org/wiki/%D0%A8%D0%B8%...%B2%D0%BE%D0%BB
на эту тему написано:

Тип wchar_t предназначен для хранения широких символов в том виде, в котором их понимают конкретные компиляторы, и это может не соответствовать Юникоду».

Получается, что я не могу, через wchar_t организовать работу по получению инфы (кириличной) из текстовых файлов, обработки её, записи обратной для разных операционных систем?
PM MAIL   Вверх
bsa
Дата 31.5.2013, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



если ты не хочешь тянуть сторонние библиотеки (iconv, например), то придется написать перекодировщик utf8 -> wide-string, wide-string -> utf8.
PM   Вверх
Proger10
Дата 31.5.2013, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



Спасибо! Наверное это наиболее удобный способ работы с UTF-8 кодировкой. UTF-8 можно хранить и в std::string, но с этим классом работать менее удобно, нежели с wstring. А в конечном итоге, всё равно, и то, и другое, перекодировать в UTF-8 прийдётся.

Добавлено через 11 минут и 32 секунды
Ещё прочёл, что 
Код

setlocale(LC_ALL,"")

может решить проблему и превратить wstring в нормальный UTF-8, а не UTF-16/32. Сработает ли такое для винды или там никакие LC_ALL не сработают?
PM MAIL   Вверх
Proger10
Дата 31.5.2013, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



Весь день убил на поиски решений относительно этой темы. Жуть просто. Не пойму, чем С++ такой выдающийся, что в нём не встроили работу с UTF-8 кодировками, в то время как другие ЯП работают влёт? Или неанглоязычники такие неудачники? Или создатели языка и вовсе не знают, что помимо английского языка бывают ещё там какие-то. Но самое интересно и от прогеров С++ тоже никаких решений на эту тему не удалось найти.

Как я понимаю, решения два:
- использовать для хранения UTF-8 класс std::string - и иметь гемор с посимвольным доступом и анализом текста в таком формате
- использовать класс std::wstring и иметь гемор с конвертацией в UTF-8 и обратно. Писать самостоятельно такое очень нехочется - изобретая такой велосипед ошибиться можно, заколебаешься потом использовать такой софт

Не пойму, как все работают с UTF-8 в С++? Неужели используя только внешние дополнительные библиотеки? Но цеплять отдельную внешнюю (Qt, GLib, GetText, Boost) только для посимвольного доступа... как-то крутова-то очень :(

Добавлено через 9 минут и 37 секунд
Почему мне необходимы как можно максимально-стандартизированное решение, так потому, что я не уверен, что внешняя библиотека сможет скомпилиться на тех жутких платформах, на которых я буду собирать проект с этой библиотекой. Пример таких платформ: Windows Phone и другие в таком духе. И встать в лужу из-за строк... сами понимаете... посему и нужно максимально-переносимое решение, которое только возможно.

Это сообщение отредактировал(а) Proger10 - 31.5.2013, 21:50
PM MAIL   Вверх
mes
Дата 31.5.2013, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Proger10 @  31.5.2013,  20:48 Найти цитируемый пост)
Не пойму, как все работают с UTF-8 в С++? 

просто больсчинству не приходится считать кол-во русских букв..


--------------------
PM MAIL WWW   Вверх
Proger10
Дата 31.5.2013, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



Цитата(mes @ 31.5.2013,  22:11)
Цитата(Proger10 @  31.5.2013,  20:48 Найти цитируемый пост)
Не пойму, как все работают с UTF-8 в С++? 

просто больсчинству не приходится считать кол-во русских букв..

Подсчитать-то как раз не проблема smile

Код

    int len = 0;
    while ( *chr ) {
        
        // Count all first-bytes (the ones that don't match 10xxxxxx)
        len += ( *chr++ & 0xc0 ) != 0x80;
        
    }


Проблема с посимвольным доступом к std::string в которой UTF-8...
PM MAIL   Вверх
Proger10
Дата 1.6.2013, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



Хотя, так если подумать, если я буду конвертить в wstring, то для отображений и для дальнейшей работы с другими библиотеками, мне всё равно нужен std::string, а насколько понимаю сконвертить wstring -> string - это ещё один гемор на голову) Чёрт, с какими же мне типами данных работать-то, если мне нужно делать простейший синтаксический анализатор русского текста, хранящийся в UTF-8?

Если получать буду в std::string - вроде хорошо. Но загвоздку пока вижу такую: как мне в другую переменную std::string присвоить третий символ из первой строки?)

Т.е. грубо говоря что-то типа:
Код

std::string str1 = "123, привет, мир!";
std::string str2 = ...... str1.at( 2 ) .... 


но ведь в str1 у меня вообще чёрти что, не фиксированный размер символов. Как их доставать, как понимать сколько занимает очередной символ и что там за символ? По сути, я знаю, что там у меня данные в формате UTF-8. Но чёрт.. чё с ними дальше-то делать  smile 


Это сообщение отредактировал(а) Proger10 - 1.6.2013, 00:41
PM MAIL   Вверх
Proger10
Дата 1.6.2013, 01:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



В общем, решил я попробовать справиться с работой UTF-8 + std::string, надеюсь Вы мне поможете с ответами на мои тупейшие вопросы, покуда в С++ я совсем не шарю smile

Сейчас я читаю спецификацию Unicode и представление UTF-8 в ней. Пытаюсь вывести строку UTF-8 и посмотреть с чем я дело имею:
Код

std::string str = "123абв";
for ( int i = 0; i < str.length(); i++ ) {
    std::cout << i << ": " << str.at( i ) << std::endl;    
}

//вывод:
0: 1
1: 2
2: 3
3: \320
4: \260
5: \320
6: \261
7: \320
8: \262


В принципе, всё верно. Значения байт ниже 128 представляются ими же в ASCII кодах, то бишь это значения: 1, 2, 3, всё верно. Дальше они "видимо" ( smile)) ) старше 127, соответственно представляются последовательностью двух байт каждое. Ок. Но что за формат чисел такой: \320, \260, это какая система счисления вообще? smile))
PM MAIL   Вверх
mes
Дата 1.6.2013, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Proger10 @  1.6.2013,  00:30 Найти цитируемый пост)
 << str.at( i )

int(str.at( i )) покажет код символа


--------------------
PM MAIL WWW   Вверх
Proger10
Дата 1.6.2013, 02:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



Спасибо!
Немного ещё продвинулся)
Получаю код символа в unsigned char и сравниваю со значением 128. Вроде пока всё правильно отображает smile

Код

std::string str = "123абв";
std::string status;

for ( int i = 0; i < str.length(); i++ ) {
    
    unsigned char ch = str.at( i );
    if ( ch < 128 ) {
        status = "lower";
    } else {
        status = "higher";    
    }
    
    std::cout << i << ": " << str.at( i ) << " " << int( str.at( i ) ) << " " << int( ch ) << " " << status << std::endl;
    
}

/*
Вывод:
0: 1 49 49 lower
1: 2 50 50 lower
2: 3 51 51 lower
3: \320 -48 208 higher
4: \260 -80 176 higher
5: \320 -48 208 higher
6: \261 -79 177 higher
7: \320 -48 208 higher
8: \262 -78 178 higher
*/


Теперь надо подумать зачем я это получил  smile Далее заглядываем в спецификацию UTF-8....

Цитата

Unicode UTF-8:
0x00000000 — 0x0000007F: 0xxxxxxx
0x00000080 — 0x000007FF: 110xxxxx 10xxxxxx
0x00000800 — 0x0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
0x00010000 — 0x001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

И видим, что если символ попадает от 0 до 127 включительно - то он однобайтовый, если от 128 до 2047 - то он двухбайтовый и т.д. Но вот тут-то сразу и возникает вопрос - а откуда у меня-то окажутся числа больше 255, они же невозможны в unsigned char. Соответственно, использовать другой тип данных вместо unsigned char? А какой? unsigned int? Тогда у меня совершенно дикие числа идут в вывод:

Цитата

вывод при: unsigned int ch = str.at( i );

0: 1 49 49 lower
1: 2 50 50 lower
2: 3 51 51 lower
3: \320 -48 4294967248 higher
4: \260 -80 4294967216 higher
5: \320 -48 4294967248 higher
6: \261 -79 4294967217 higher
7: \320 -48 4294967248 higher
8: \262 -78 4294967218 higher


Как же здесь быть? По-моему что-то я уже напутал и относительно диапазонов UTF-8 там что-то другое имелось ввиду..) По чему же мы определяем вхождения в те диапазоны UTF-8, по очередному символу или по чему-то другому?

Это сообщение отредактировал(а) Proger10 - 1.6.2013, 02:37
PM MAIL   Вверх
mes
Дата 1.6.2013, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Proger10 @  1.6.2013,  01:29 Найти цитируемый пост)
Как же здесь быть? По-моему что-то я уже напутал и относительно диапазонов UTF-8 там что-то другое имелось ввиду..) По чему же мы определяем вхождения в те диапазоны UTF-8, по очередному символу или по чему-то другому?

под напильник (для длины из 3х символов)
Код

#include <iostream>

int main()
{
  std::string s = "hallo привет";
  
  for (size_t i=0; i<s.size(); )
  {
    size_t ln=0;

    if ((unsigned char)(s[i])>0x7F) ++ln;
    else
    if ((unsigned char)(s[i+1])>0x07) ++ln;
    else  ++ln;

    std::cout << s.substr(i, ln) << std::endl; 

    i+=ln;
 }
}


Добавлено @ 12:17
Цитата

h
a
l
l
o
 
п
р
и
в
е
т


Это сообщение отредактировал(а) mes - 1.6.2013, 14:30


--------------------
PM MAIL WWW   Вверх
Proger10
Дата 1.6.2013, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



mes
Спасибо! Только не очень понял код smile Как мне кажется, там трёхбайтовых вообще нет в данной строке, это верно?
Судя по количеству байт:
Цитата
14:31:01 codepages $ cat 1.txt
hallo привет
14:35:08 codepages $ cat 1.txt | xxd -b
0000000: 01101000 01100001 01101100 01101100 01101111 00100000  hallo 
0000006: 11010000 10111111 11010001 10000000 11010000 10111000  ......
000000c: 11010000 10110010 11010000 10110101 11010001 10000010  ......

14:35:10 codepages $ 


Не очень понял по Вашему коду, что обозначает число 0x07? Понял, что 0x7F - это проверка условия на значение большее, чем 127, но 0х07 - это, вроде бы, 7 в десятичной? А зачем эта проверка делается? Такое чего-то я нигде не читал(

В целом смысл кода понятен, но откуда вот это число взялось непонятно. Кстати, я бы там в цикле не size(), а ( size() - 1 ) ставил бы, поскольку идёт выход за границу для s[ i + 1 ].

С substr - классный подход вообще получился! Спасибо! smile

Добавлено через 10 минут и 47 секунд
Не очень вообще понимаю как узнать в UTF-8 сколька байтный символ сейчас перед нами. Смотрю в таблицу:
http://www.utf8-chartable.de/unicode-utf8-...24&utf8=dec

я разложил там по 10-тичным значениям для удоства. smile Наши символы представлены двухбайтными, например: 208 144, 208 149 и т.д. Всё верно. Но трёхбайтные представлены, в принципе аналогично:

http://www.utf8-chartable.de/unicode-utf8-...24&utf8=dec

т.е.: 224 176 130, 224 176 134. Как их отличить-то? Все числа одновременно больше 127... Мне подумалось, может логика такая, что если очередное число больше 127, то следующее число добавляем в текущее... но нет ведь!

Добавлено через 14 минут и 26 секунд
Аа, вот оно что. Оказывается та инфа о диапазонах указывала на порядковый номер символа в ЮТФ кодировке. Ок:
http://www.utf8-chartable.de/unicode-utf8-...24&utf8=dec
т.е. начинающиеся с номера 2048, действительно, идут 3х-байтовыми. Но блин, как узнать какой у символа порядковый номер в ЮТФе? smile Перед нами же вообще числа!) Я, понимаю, что мне такие буквы не нужны, но всё-таки интересно! smile Уж если изучать тему, так изучать!  smile 
PM MAIL   Вверх
mes
Дата 1.6.2013, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Proger10 @  1.6.2013,  12:39 Найти цитируемый пост)
Не очень понял по Вашему коду, что обозначает число 0x07? Понял, что 0x7F - это проверка условия на значение большее, чем 127, но 0х07 - это, вроде бы, 7 в десятичной? А зачем эта проверка делается? Такое чего-то я нигде не читал(


Цитата(Proger10 @  1.6.2013,  01:29 Найти цитируемый пост)
Unicode UTF-8:
0x00000000 — 0x000000[7F]: 0xxxxxxx
0x00000080 — 0x0000[07]FF: 110xxxxx 10xxxxxx
0x00000800 — 0x0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
0x00010000 — 0x001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx


Добавлено @ 14:32
Цитата(Proger10 @  1.6.2013,  12:39 Найти цитируемый пост)
. Кстати, я бы там в цикле не size(), а ( size() - 1 ) ставил бы, поскольку идёт выход за границу для s[ i + 1 ].

там было else забыто.. (поправил).. а насчет границ, так под напильник же )


Это сообщение отредактировал(а) mes - 1.6.2013, 14:39


--------------------
PM MAIL WWW   Вверх
Proger10
Дата 1.6.2013, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



Упс, всё равно не пойму, что именно Вы выделили полужирным smile Т.е. вот это число: 0x000007FF равно вот этому: 0x07 в Вашем коде? Или по какой логике там сравнение с 0х07, не пойму smile
Вроде 0x000007FF в десятичной это: 2047, а 0х07 это 7 smile
PM MAIL   Вверх
mes
Дата 1.6.2013, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Proger10 @  1.6.2013,  12:39 Найти цитируемый пост)
я разложил там по 10-тичным значениям для удоства.

лучше в шестнадцатиричной.. меньше путаницы будет.. 

Цитата(Proger10 @  1.6.2013,  12:39 Найти цитируемый пост)
Не очень вообще понимаю как узнать в UTF-8 сколька байтный символ сейчас перед нами. 

утф8 так устроена, что по текущему значению можно узнать есть ли хвост.. смотрите пример..


--------------------
PM MAIL WWW   Вверх
Dem_max
Дата 1.6.2013, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



А что уже std::wstring str = L"123абв"; уже отменили ???


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
mes
Дата 1.6.2013, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Proger10 @  1.6.2013,  13:36 Найти цитируемый пост)
Или по какой логике там сравнение с 0х07, не пойму

там пример на скорую руку на скорую руку.. без анализа таблицы... оставил для Вас ))

Добавлено через 1 минуту и 7 секунд
Цитата(Proger10 @  1.6.2013,  12:39 Найти цитируемый пост)
т.е. начинающиеся с номера 2048, действительно, идут 3х-байтовыми.

ага примерно так )


--------------------
PM MAIL WWW   Вверх
Proger10
Дата 1.6.2013, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



Разве что я вижу такую зависимость в терминах десятичного счисления: если первое число больше 223, то отсюда начинаются уже трёхбайтные значения. Соответственно, нужно просто прочесать все такие диапазоны и поставить строгие условия, типа: если первый символ больше n, но меньше m, то соответственно он составляет столько-то байт.

Добавлено через 2 минуты и 47 секунд
mes 
АА, понятно. Спасибо за ответ! Тем не менее, порыв таблицу, вроде я сориентировался уже. Спасибо Вам за помощь! Вы мне очень помогли! Плюсанул в репутацию smile
PM MAIL   Вверх
mes
Дата 1.6.2013, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Proger10 @  1.6.2013,  13:42 Найти цитируемый пост)
Соответственно, нужно просто прочесать все такие диапазоны и поставить строгие условия, типа: если первый символ больше n,

так и делается в примере..

Добавлено через 4 минуты и 50 секунд
Цитата(Proger10 @  1.6.2013,  12:39 Найти цитируемый пост)
Но блин, как узнать какой у символа порядковый номер в ЮТФе?

если вычесть диапазон, к которому принадлежит символ, то останется смещение символа в таблице для этого диапазона.. итого 4 таблицы разной длины (по длине диапазона)



--------------------
PM MAIL WWW   Вверх
Dem_max
Дата 1.6.2013, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



ТС почитай тут
http://ru.wikipedia.org/wiki/UTF-8


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
volatile
Дата 1.6.2013, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



ну ну, искатели приключений ...
smile
PM MAIL   Вверх
mes
Дата 1.6.2013, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(volatile @  1.6.2013,  17:23 Найти цитируемый пост)
ну ну, искатели приключений ...

 smile 
Proger10, http://sourceforge.net/projects/utfcpp/


--------------------
PM MAIL WWW   Вверх
Proger10
Дата 1.6.2013, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



Цитата(mes @ 1.6.2013,  22:04)
Цитата(volatile @  1.6.2013,  17:23 Найти цитируемый пост)
ну ну, искатели приключений ...

 smile 
Proger10, http://sourceforge.net/projects/utfcpp/

Это я видел вчера) но тоже по-моему многова-то кода для такой, как я понял уже, простой задачи smile Теперь реализую класс собственной строки, где все основные операции и опишу, их не так много) доступ к произвольному символу, поиск в строке, да сортировка букв. Представлю эту "строку" в виде массива таких однобайтовых/двухбайтовых символов - да и делов-то smile

Добавлено через 36 секунд
Цитата(volatile @ 1.6.2013,  18:23)
ну ну, искатели приключений ...
smile

А почему? Вроде всё же разрешилось легко? smile

Добавлено через 6 минут и 56 секунд
Кстати, вот единственное, что осталось ещё непонятым в UTF-8, так это вот это указание:
Цитата
Несмотря на то, что UTF-8 позволяет указать один и тот же символ несколькими способами, только наиболее короткий из них правильный. Остальные формы должны отвергаться по соображениям безопасности.


это о каком одном и том же символе речь идёт? Если например символ выглядит одинаково во многих языках, выбрать надо тот, порядковый номер, которого, короче? Так что ли? smile Вроде в русском и английском таких нет или речь как раз про: а, с, о, которые на обоих языках одинаковы? Вроде проверил в блокноте (MacOS, Coda + UTF-8) - да не заменяются никакие символы никакими младшими... заменяются теми, что и в Юникод-таблице.. о чём там речь - ума не приложу smile
PM MAIL   Вверх
volatile
Дата 1.6.2013, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(Proger10 @  1.6.2013,  23:01 Найти цитируемый пост)
А почему? Вроде всё же разрешилось легко?

Что разрешилось то?

Цитата(Proger10 @  1.6.2013,  23:01 Найти цитируемый пост)
Теперь реализую класс собственной строки, где все основные операции и опишу

Цитата(Proger10 @  1.6.2013,  23:01 Найти цитируемый пост)
эту "строку" в виде массива таких однобайтовых/двухбайтовых символов - да и делов-то 

угу. еще свой СТЛ напишите, делов то...
Команду тестеров нанять не забудьте только, по отлову багов...

PM MAIL   Вверх
Proger10
Дата 2.6.2013, 03:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



volatile
Ну вроде задачу более-менее понял, попробую реализовать, а там посмотрю, может и правда гемор будет огромный, но пока вроде ничего беды не предвещает smile

Правда у меня сейчас большая проблема в основах C++))) Я не знаю как мне в std::string вообще закидывать эти UTF-8 коды =) Не подскажете? =) Задача такая: знаю десятичные коды (да и любые удобные для системы), если десятичные то последовательность двух: "208 176" - это последовательность буквы "а". А вот как эту последовательность мне записать в std::string переменную? smile С какими типами данных здесь мне нужно поработать?)

Добавлено @ 03:51
Хотя... полагаю, так? 

Код
    std::string str5 = "";
    str5.append( 1, 208 );
    str5.append( 1, 176 );

// или даже так: 
    str5 += 208;
    str5 += 176;


Работает smile в str5 как раз буква "а". Класс  smile "Спасибо, теперь я программист!"  smile 

Это сообщение отредактировал(а) Proger10 - 2.6.2013, 04:18
PM MAIL   Вверх
volatile
Дата 2.6.2013, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(Proger10 @  2.6.2013,  03:43 Найти цитируемый пост)
но пока вроде ничего беды не предвещает 

Proger10, попробуйте для начала написать хотябы
operator [], для вашего класса строки.  smile 



PM MAIL   Вверх
mes
Дата 2.6.2013, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Proger10 @  1.6.2013,  22:01 Найти цитируемый пост)
 Теперь реализую класс собственной строки, где все основные операции и опишу, их не так много) доступ к произвольному символу, поиск в строке, да сортировка букв. Представлю эту "строку" в виде массива таких однобайтовых/двухбайтовых символов - да и делов-то


ну так wstring уже есть smile

Добавлено через 1 минуту и 9 секунд
на крайней случай есть еше std::basic_string

Добавлено через 4 минуты и 49 секунд
Цитата(Proger10 @  2.6.2013,  02:43 Найти цитируемый пост)
Работает  в str5 как раз буква "а". Класс   "Спасибо, теперь я программист!" 

если делаете для опыта, то посмотрите как решено в уже упомянутой utfcpp,
а если для дела, то лучше отказаться от велосипеда, тем более при таком уровне вопросов..

Добавлено через 7 минут и 53 секунды
Цитата(Proger10 @  31.5.2013,  20:48 Найти цитируемый пост)
Почему мне необходимы как можно максимально-стандартизированное решение, так потому, что я не уверен, что внешняя библиотека сможет скомпилиться на тех жутких платформах, на которых я буду собирать проект с этой библиотекой. 

а за свой код Вы уверенны, что он скомпилируется ? а если сторонняя библиотечка маленькая и аккуратная в ней к томуже можно легко поправить, как и в своем коде.. 



--------------------
PM MAIL WWW   Вверх
Proger10
Дата 2.6.2013, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



mes
Цитата
ну так wstring уже есть smile

По идее, да, но чего же класс-то таким разным получился, что на разных операционных системах представляется по-разному? С wstring ещё больше гемора, чем с UTFфным std::string smile Мне легче работать с текстом как с цифрами UTF-8, нежели бегать за багами wstring'а - где там на какой платформе он как ещё представится, постоянно отлаживать, анализировать, а тут наверняка знаешь, что у тебя там за данные UTF-16 или UTF-8, UTF-32... Да и в случае с std::string и деться некуда - UTF-8 и std::string - так и сдампиться в файл как обычно. На UTF-8 у меня уже лет 8-10 операционки работают, при программировани только с ними дело имел (в крайнем случае unix iconv'ом приводил все файлы к ней), поэтому эта кодировка не нова мне, но копаться в её внутренностях только сейчас пришлось smile

Это сообщение отредактировал(а) Proger10 - 2.6.2013, 14:03
PM MAIL   Вверх
mes
Дата 2.6.2013, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Proger10 @  2.6.2013,  13:02 Найти цитируемый пост)
, что на разных операционных системах представляется по-разному?

проблема не в wstring, а в базовом wchar`е.. используйте basic_string с нужным типом кирпича для вашей стены.. 

Цитата(Proger10 @  2.6.2013,  13:02 Найти цитируемый пост)
 С wstring ещё больше гемора, чем с UTFфным std::string 

Вы сейчас сравниваете теплое с мягким... (w)string это всего лишь контейнер для хранения. 
А utf-8 это формат хранения текста в контейнере..  Недостаток utf-8 в переменной длине символа и в этом же  ее преимушество. При этом хранить его можно как в string так и в wstring. Только при хранении в однобайтовом контейнере границы символа. В многобайтовой же строке для каждого символа есть свое место. Естественно при переносе текста между форматами хранения нужен конвертер.

Добавлено через 5 минут и 1 секунду
Цитата(Proger10 @  2.6.2013,  13:02 Найти цитируемый пост)
 Мне легче работать с текстом как с цифрами UTF-8, нежели бегать за багами wstring'а -

опять же высказывание показывает непонимание происходящего и подмена обстоятельств..


--------------------
PM MAIL WWW   Вверх
kolesnle
Дата 2.6.2013, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Упертый сишник
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 22.3.2013

Репутация: нет
Всего: нет



Цитата(Proger10 @  31.5.2013,  18:26 Найти цитируемый пост)
setlocale(LC_ALL,"")

работает в windows. И всегда работало...
PM MAIL   Вверх
bsa
Дата 3.6.2013, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Proger10, кончай заниматься велосипедоизобретательством. Есть такая вещь в С++ называется locale. У всех потоков есть getloc и imbue, которые позволяют задать локаль. С ее помощью, можно сделать автоматическую конвертацию читаемые/записываемых данных между UTF-8 и wstring. Под линуксом это работает без проблем.
PM   Вверх
borisbn
Дата 12.6.2013, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(volatile @  2.6.2013,  11:11 Найти цитируемый пост)
попробуйте для начала написать хотябы
operator [], для вашего класса строки.


а затем функцию length(), возвращающую количество символов (не байт) в строке
 smile 

Это сообщение отредактировал(а) borisbn - 12.6.2013, 10:41


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
volatile
Дата 12.6.2013, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



borisbn, ну кол-во символов теоретически можно написать, 
а вот оператор [], написать нельзя, даже теоретически.
Код

s = "abc";
s [1] = 'Б';
//здесь s должно быть равно "aБc"

 smile

Добавлено через 6 минут и 17 секунд
причем это первое что ТС собирался сделать из не так многого:
Цитата(Proger10 @  1.6.2013,  23:01 Найти цитируемый пост)
Теперь реализую класс собственной строки, где все основные операции и опишу, их не так много) доступ к произвольному символу, поиск в строке, да сортировка букв. 


PM MAIL   Вверх
mes
Дата 12.6.2013, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(volatile @  12.6.2013,  11:26 Найти цитируемый пост)
а вот оператор [], написать нельзя, даже теоретически.

можно, если этот оператор будет оперировать не байтом  smile 


--------------------
PM MAIL WWW   Вверх
bsa
Дата 12.6.2013, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(mes @  12.6.2013,  21:26 Найти цитируемый пост)
можно, если этот оператор будет оперировать не байтом
причем сложность будет линейная.
PM   Вверх
volatile
Дата 12.6.2013, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(mes @  12.6.2013,  20:26 Найти цитируемый пост)
можно, если этот оператор будет оперировать не байтом    

Естественно если писать wstring, то можно.
Но там по условию ТС хранит UTF8 строку. 
оператор[] должен вернуть неконстантую ссылку, на символ из этой строки.

хорошо, скажем мягче. я не знаю как писать такой оператор.
smile

Добавлено через 12 минут и 29 секунд
Разве что с привлечение каких-то временных объектов...
и постоянным конвертированием UTF8<->UTF16/32.
но заставить такое глюкало корректно работать во  всех режимах, врядли получицца...

PM MAIL   Вверх
mes
Дата 15.6.2013, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(volatile @  12.6.2013,  22:29 Найти цитируемый пост)
оператор[] должен вернуть неконстантую ссылку, на символ из этой строки.

Цитата(volatile @  12.6.2013,  22:29 Найти цитируемый пост)
Разве что с привлечение каких-то временных объектов...

ага, возвращением прокси объекта

Цитата(volatile @  12.6.2013,  22:29 Найти цитируемый пост)
я не знаю как писать такой оператор.

как будет свободное время напишу примерчик

Цитата(volatile @  12.6.2013,  22:29 Найти цитируемый пост)
и постоянным конвертированием UTF8<->UTF16/32.

 smile 
НИ о какой конвертации кодировок тут речи нет !  smile 

возможно из за путаницы понятий, подразумевается  конвертация в многобайтовый контейнер ? да для внутреннего пользования можно и так хранить..
а можно динамично искать ну#ный порядковый номер, но тогда 
Цитата(bsa @  12.6.2013,  20:57 Найти цитируемый пост)
сложность будет линейная. 

а в первом варианте нет.. 



--------------------
PM MAIL WWW   Вверх
volatile
Дата 16.6.2013, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(mes @  15.6.2013,  13:32 Найти цитируемый пост)
НИ о какой конвертации кодировок тут речи нет !
возможно из за путаницы понятий, подразумевается  конвертация в многобайтовый контейнер 

Не из-за путаницы понятий  smile , а просто чтобы покороче написать.
Да именно это я и имел ввиду.

Цитата(mes @  15.6.2013,  13:32 Найти цитируемый пост)
как будет свободное время напишу примерчик

mes, примерчик-то написать можно. Сложность там будет в том чтобы 
Цитата(volatile @  12.6.2013,  23:29 Найти цитируемый пост)
заставить такое глюкало корректно работать во  всех режимах,

А заставлять вас писать полный вариант - мне абсолютно не удобно.
Работа большая и очень не благодарная.


Это сообщение отредактировал(а) volatile - 16.6.2013, 00:21
PM MAIL   Вверх
mes
Дата 23.6.2013, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(volatile @  15.6.2013,  23:16 Найти цитируемый пост)
Сложность там будет в том чтобы 


Цитата(volatile @  15.6.2013,  23:16 Найти цитируемый пост)
заставить такое глюкало корректно работать во  всех режимах,

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



--------------------
PM MAIL WWW   Вверх
mes
Дата 23.6.2013, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(mes @  15.6.2013,  12:32 Найти цитируемый пост)

Цитата

можно, если этот оператор будет оперировать не байтом

Цитата

я не знаю как писать такой оператор.

как будет свободное время напишу примерчик


чего то хорошей идеи для примера не пришло, вот накалякал пример прокси на скорую руку :

Код

#include <iostream>

struct proxy
{
  proxy(int * pos) : _pos(pos){}

  operator int () { return *_pos; }
  void operator=(int value) 
  {
    *_pos=value;
  } 

  int * _pos; 
};


struct mystring : std::string
{

  mystring(const char * s) : std::string(s) {}
  proxy operator[](size_t idx)
  {
    return proxy((int*)&at(idx));
  }
};

int main ()
{
  mystring s= "hello world";

  std::cout << s <<std::endl;

  s[3] = *((int*)"LO W");

  std::cout << s <<std::endl;
}



--------------------
PM MAIL WWW   Вверх
borisbn
Дата 23.6.2013, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



> proxy((int*)&at(idx));
С русскими буквами в utf-8 работать не будет. Вернее, поведение будет отличаться от предполагаемого.
Например, я бы хотел, чтобы в строке "привет мир" символ с индексом 3 был бы 'в'


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 23.6.2013, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(borisbn @  23.6.2013,  15:05 Найти цитируемый пост)
С русскими буквами в utf-8 работать не будет

нда..  smile .. это был не пример работы с русскими буквами.. а пример оператора[] возвращающего не сырую ссылку, а некую прокси, в которой можно имплементировать подходящую логику..
эх.. чувствую придется писать полноценный пример, не смотря на лень  smile

Добавлено @ 17:49
для начала все ж 
Цитата(borisbn @  23.6.2013,  15:05 Найти цитируемый пост)
proxy((int*)&at(idx));
С русскими буквами в utf-8 работать не будет.

а если вместо 
Цитата(mes @  23.6.2013,  14:05 Найти цитируемый пост)
 *_pos=value; 

replace_utf_char(_pos, value)

ну и соотвественно  вместо 

Цитата(mes @  23.6.2013,  14:05 Найти цитируемый пост)
(int*)&at(idx)

utf_index(idx)
?

Это сообщение отредактировал(а) mes - 23.6.2013, 17:49


--------------------
PM MAIL WWW   Вверх
volatile
Дата 23.6.2013, 23:16 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(mes @  23.6.2013,  17:41 Найти цитируемый пост)
 это был не пример работы с русскими буквами.. 

mes, ну оно пока, даже и с английскими не работает:
Код

int main ()
{
  mystring s= "hello world";

  std::cout << s <<std::endl;
  s[0] = 'H'; // Меняем первую букву.
  std::cout << s <<std::endl;
}


Код

hello world
H   o world


такое вообще не компилируецца:
Код

s[0] = s[4] = c;

а если подредактировать проксю, чтобы возвращал себя, то компилировацца таки будет, но работать будет не правильно. smile 

короче, неблагодарное это дело.... 
PM MAIL   Вверх
zevs5
Дата 22.9.2016, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 13.11.2006

Репутация: нет
Всего: нет



Цитата(mes @ 1.6.2013,  12:17)
Цитата(Proger10 @  1.6.2013,  01:29 Найти цитируемый пост)
Как же здесь быть? По-моему что-то я уже напутал и относительно диапазонов UTF-8 там что-то другое имелось ввиду..) По чему же мы определяем вхождения в те диапазоны UTF-8, по очередному символу или по чему-то другому?

под напильник (для длины из 3х символов)
Код

#include <iostream>

int main()
{
  std::string s = "hallo привет";
  
  for (size_t i=0; i<s.size(); )
  {
    size_t ln=0;

    if ((unsigned char)(s[i])>0x7F) ++ln;
    else
    if ((unsigned char)(s[i+1])>0x07) ++ln;
    else  ++ln;

    std::cout << s.substr(i, ln) << std::endl; 

    i+=ln;
 }
}


Добавлено @ 12:17
Цитата

h
a
l
l
o
 
п
р
и
в
е
т

Спасибо за подсказку, три дня лазил по интернету и ничего не находил, а тут наткнулся и ниточка появилась.
Еще раз спасибо.
PM MAIL   Вверх
bsa
Дата 26.9.2016, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



zevs5, это не совсем корректный пример. С кириллицей и латиницей он работать конечно будет, но если там будут иероглифы, то работать перестанет. Самый правильный способ - все операции с "буквами" и "символами" производить на строках из wchar_t.
Код
#include <wchar.h>

wchar_t *dest = malloc(...);
...
mbstate_t state;
mbsinit(&state);
size_t numSymb = mbrtowc(dest, src, src_len, &state);

описание wchar.h
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1096 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.