Здравствуйте уважаемые господа!
Я хочу спросить знающего человека по кодировке LINUX .
Я тут своял некую тестовую приблуду которая выводит слегка непонятные результаты своей работы .
Если не трудно обьясните мне, что тут с кодировкой.
char* instr ;
instr = "русские" ; // входные данные память под них выделена раньше.
Buffstr = new char[strlen(instr)] ;
Buffstr = instr ;
// перекодировка в другую кодировку пока не ясно в какую
for(int i=0; i<strlen(Buffstr);i++)
{
cout << (long int)Buffstr[i] << endl ;
}
cout << Buffstr << endl ;
Прога выводит вот такие данные :
-47
-128
-47
-125
-47
-127
-47
-127
-48
-70
-48
-72
-48
-75
русские
Мне очень интересно почему русские буквы тут представлены двумя числами, какая это может быть кодировка и можно ли свести их к одной цифре?
Здравствуйте, Аноним, Вы писали:
А> Мне очень интересно почему русские буквы тут представлены двумя числами, какая это может быть кодировка и можно ли свести их к одной цифре?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте уважаемые господа! А> Я хочу спросить знающего человека по кодировке LINUX . А> Я тут своял некую тестовую приблуду которая выводит слегка непонятные результаты своей работы . А> Если не трудно обьясните мне, что тут с кодировкой.
А>
А> char* instr ;
А> instr = "русские" ; // входные данные память под них выделена раньше.
А>
Копирование строк производится функцией strcpy.
А>
Ты выделяешь память под Buffstr, но потом присваиваешь указателю другой указатель. Это приведёт к утечке памяти и падению при освобождении памяти.
А>
А> // перекодировка в другую кодировку пока не ясно в какую
А> for(int i=0; i<strlen(Buffstr);i++)
А> {
А> cout << (long int)Buffstr[i] << endl ;
А> }
А> cout << Buffstr << endl ;
А>
Тут не происходит перекодировки.
А>Прога выводит вот такие данные : А>-47 А>-128 А>-47 А>-125 А>-47 А>-127 А>-47 А>-127 А>-48 А>-70 А>-48 А>-72 А>-48 А>-75 А>русские А> А>Мне очень интересно почему русские буквы тут представлены двумя числами, какая это может быть кодировка и можно ли свести их к одной цифре?
Сохрани исходник не в UTF-8, а в другой кодировке.
P.S. при вставке C-кода, заключай его внутри тега форматирования ccode.
P.P.S. А зачем несколько очень похожих тем?
Re[2]: Кодировка
От:
Аноним
Дата:
14.05.09 08:42
Оценка:
Здравствуйте, AleksandrN, Вы писали:
AN>Здравствуйте, Аноним, Вы писали:
А>>Здравствуйте уважаемые господа! А>> Я хочу спросить знающего человека по кодировке LINUX . А>> Я тут своял некую тестовую приблуду которая выводит слегка непонятные результаты своей работы . А>> Если не трудно обьясните мне, что тут с кодировкой.
А>>
А> char* instr ;
А>> instr = "русские" ; // входные данные память под них выделена раньше.
А>>
AN>Копирование строк производится функцией strcpy.
А>>
AN>Ты выделяешь память под Buffstr, но потом присваиваешь указателю другой указатель. Это приведёт к утечке памяти и падению при освобождении памяти.
А>>
А> // перекодировка в другую кодировку пока не ясно в какую
А>> for(int i=0; i<strlen(Buffstr);i++)
А>> {
А>> cout << (long int)Buffstr[i] << endl ;
А>> }
А>> cout << Buffstr << endl ;
А>>
AN>Тут не происходит перекодировки.
А>>Прога выводит вот такие данные : А>>-47 А>>-128 А>>-47 А>>-125 А>>-47 А>>-127 А>>-47 А>>-127 А>>-48 А>>-70 А>>-48 А>>-72 А>>-48 А>>-75 А>>русские А>> А>>Мне очень интересно почему русские буквы тут представлены двумя числами, какая это может быть кодировка и можно ли свести их к одной цифре?
AN>Сохрани исходник не в UTF-8, а в другой кодировке.
AN>P.S. при вставке C-кода, заключай его внутри тега форматирования ccode. AN>P.P.S. А зачем несколько очень похожих тем?
Замечательно спасибо за критику буду стараться исправится .
Но мне решительно не ясно как в одной переменной типа INT уместилось два числа ?
По какому алгоритму тогда перекодировать в другую кодировку ?
Например в KOI8 .
AN>>Сохрани исходник не в UTF-8, а в другой кодировке.
AN>>P.S. при вставке C-кода, заключай его внутри тега форматирования ccode. AN>>P.P.S. А зачем несколько очень похожих тем?
А> Замечательно спасибо за критику буду стараться исправится .
А> Но мне решительно не ясно как в одной переменной типа INT уместилось два числа ? А> По какому алгоритму тогда перекодировать в другую кодировку ? А> Например в KOI8 .
гугл UTF8 или юникод.
файл, сохранить как... tratata.cpp — выбрать нужную кодировку...
зы: писали уже... AN>>Сохрани исходник не в UTF-8, а в другой кодировке.
Ничто не ограничивает полет мысли программиста так, как компилятор.
Здравствуйте, Аноним, Вы писали:
А> Но мне решительно не ясно как в одной переменной типа INT уместилось два числа ?
В каждой переменной одно число. Чисел выводится в два раза больше, чем символов из-за того, что в кодировке UTF-8 каждому символу может соответствовать различное число байт. Русские буквы в этой кодировке кодируются двумя байтами, а функция strlen ничего про кодировки не знает и считает количество байт от переданного указателя до того места, где встречается '\0'.
В предыдущем сообщении я не указал на ещё одну ошибку — при выделении памяти под строку, в кторую будут копироваться данные из какой-либо другой строки, нужно выделять количество памяти не strlen(старая строка), а на 1 больше (для '\0').
Т.е. вместо
Buffstr = new char[strlen(instr)] ;
нужно писать
Buffstr = new char[strlen(instr)+1] ;
Похоже, что ты начал изучать Си после изучения другого языка, в котором есть встроенный класс строк и сборщик мусора. Прочитай какую-нибудь книгу по Си, но читай так, будто других языков не знаешь. Иначе будешь делать много ошибок при использовании низкоуровневых возможностей языка.
А>> char* instr ;
А>>> instr = "русские" ; // входные данные память под них выделена раньше.
А>>>
AN>>Копирование строк производится функцией strcpy. V>А в этом коде ничего криминального нет.
А я думал что есть. Если учитывать что язык С++
char* != const char*
Или я не прав?