Кодировка
От: Аноним  
Дата: 14.05.09 06:11
Оценка:
Здравствуйте уважаемые господа!
Я хочу спросить знающего человека по кодировке 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
русские

Мне очень интересно почему русские буквы тут представлены двумя числами, какая это может быть кодировка и можно ли свести их к одной цифре?
Re: гуголь UTF-8
От: Erop Россия  
Дата: 14.05.09 06:25
Оценка:
Здравствуйте, Аноним, Вы писали:

А> Мне очень интересно почему русские буквы тут представлены двумя числами, какая это может быть кодировка и можно ли свести их к одной цифре?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Кодировка
От: AleksandrN Россия  
Дата: 14.05.09 07:17
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте уважаемые господа!

А> Я хочу спросить знающего человека по кодировке LINUX .
А> Я тут своял некую тестовую приблуду которая выводит слегка непонятные результаты своей работы .
А> Если не трудно обьясните мне, что тут с кодировкой.


А>
А>  char* instr ; 
А>        instr = "русские" ; // входные данные память под них выделена раньше. 
А>

Копирование строк производится функцией strcpy.

А>
А>    Buffstr = new char[strlen(instr)]  ;
А>    Buffstr = instr ;
А>

Ты выделяешь память под 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.

А>>
А>    Buffstr = new char[strlen(instr)]  ;
А>>    Buffstr = instr ;
А>>

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 .
Re[3]: Кодировка
От: dcb-BanDos Россия  
Дата: 14.05.09 08:48
Оценка:
Здравствуйте, Аноним, Вы писали:


AN>>Сохрани исходник не в UTF-8, а в другой кодировке.


AN>>P.S. при вставке C-кода, заключай его внутри тега форматирования ccode.

AN>>P.P.S. А зачем несколько очень похожих тем?

А> Замечательно спасибо за критику буду стараться исправится .


А> Но мне решительно не ясно как в одной переменной типа INT уместилось два числа ?

А> По какому алгоритму тогда перекодировать в другую кодировку ?
А> Например в KOI8 .

гугл UTF8 или юникод.
файл, сохранить как... tratata.cpp — выбрать нужную кодировку...

зы: писали уже... AN>>Сохрани исходник не в UTF-8, а в другой кодировке.
Ничто не ограничивает полет мысли программиста так, как компилятор.
Re[3]: Кодировка
От: AleksandrN Россия  
Дата: 14.05.09 10:30
Оценка:
Здравствуйте, Аноним, Вы писали:

А> Но мне решительно не ясно как в одной переменной типа INT уместилось два числа ?

В каждой переменной одно число. Чисел выводится в два раза больше, чем символов из-за того, что в кодировке UTF-8 каждому символу может соответствовать различное число байт. Русские буквы в этой кодировке кодируются двумя байтами, а функция strlen ничего про кодировки не знает и считает количество байт от переданного указателя до того места, где встречается '\0'.

В предыдущем сообщении я не указал на ещё одну ошибку — при выделении памяти под строку, в кторую будут копироваться данные из какой-либо другой строки, нужно выделять количество памяти не strlen(старая строка), а на 1 больше (для '\0').
Т.е. вместо
Buffstr = new char[strlen(instr)] ;
нужно писать
Buffstr = new char[strlen(instr)+1] ;


Похоже, что ты начал изучать Си после изучения другого языка, в котором есть встроенный класс строк и сборщик мусора. Прочитай какую-нибудь книгу по Си, но читай так, будто других языков не знаешь. Иначе будешь делать много ошибок при использовании низкоуровневых возможностей языка.
Re[2]: Кодировка
От: Vamp Россия  
Дата: 14.05.09 20:48
Оценка:
А>>
А>  char* instr ; 
А>>        instr = "русские" ; // входные данные память под них выделена раньше. 
А>>

AN>Копирование строк производится функцией strcpy.
А в этом коде ничего криминального нет.
Да здравствует мыло душистое и веревка пушистая.
Re[3]: Кодировка
От: yurror Россия  
Дата: 15.05.09 06:47
Оценка:
Здравствуйте, Vamp, Вы писали:

А>>>
А>>  char* instr ; 
А>>>        instr = "русские" ; // входные данные память под них выделена раньше. 
А>>>

AN>>Копирование строк производится функцией strcpy.
V>А в этом коде ничего криминального нет.
А я думал что есть. Если учитывать что язык С++
char* != const char*
Или я не прав?
Re[4]: Кодировка
От: Vamp Россия  
Дата: 15.05.09 13:16
Оценка:
А>>>>
А>>>  char* instr ; 
А>>>>        instr = "русские" ; // входные данные память под них выделена раньше. 
А>>>>


Y>char* != const char*

Y>Или я не прав?
Прав. Но подобная конструкция поддерживается стандартом для совместимости со старыми компиляторами.
Да здравствует мыло душистое и веревка пушистая.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.