Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как перекодировать строку символов из кодировки


Автор: Royan 15.5.2005, 19:13
Парни привет!

Скажите пожалуйста как мне меньшей кровью перекодировать строку символов из кодировки ANSI в кодировку ASCII (кодировка window в кодировку DOS), в сях или WinAPI есть какая-нить подобная функция? Или там просто коды символом поменять?

Автор: Alastis 16.5.2005, 07:01
В ANSI русские буквы кодируются числами от 192 до 255, а в ASCII - от 128 до 175 (А..Яа..п) и от 224 до 239 (р..я). Думаю довольно просто написать свою функциюsmile

Автор: Void 16.5.2005, 19:17
Ф-ции WinAPI: CharToOem, CharToOemBuff (это Win->DOS), OemToChar и OemToCharBuff (DOS->Win) - это то, что вам нужно smile

Цитата(Alastis @ 16.5.2005, 09:01)
В ANSI русские буквы кодируются числами от 192 до 255, а в ASCII - от 128 до 175 (А..Яа..п) и от 224 до 239 (р..я). Думаю довольно просто написать свою функциюsmile


Сколько я помню, русские буквы в CP866 идут не совсем в алфавитном порядке. Так что если уж писать перекодировку самому - то проще таблицу для диапазона 128..255 сделать (то что ниже - стандарт, который, кстати и называется ASCII).

Автор: CaptainFlint 18.5.2005, 19:41
Цитата(Void @ 16.5.2005, 19:17)
Сколько я помню, русские буквы в CP866 идут не совсем в алфавитном порядке.

Это в KOI-8 они идут не по порядку, а в 866 по порядку, только, как правильно заметил Alastis, диапазон там не целый, а "разорванный" на два куска.

Автор: jonie 29.10.2006, 12:53
дааавно-давно делал так:
Код

void Dos2Win(uchar * lpBuffer){
    for (;*lpBuffer;lpBuffer++)    {
        if (*lpBuffer>=0x80 && *lpBuffer<=0xAF){
                *lpBuffer+=(0xC0-0x80);
        }
        else
            if (*lpBuffer>=0xE0 && *lpBuffer<=0xEF){
                *lpBuffer+=(0xF0-0xE0);
            }
    }
}

Код

void Win2Dos(uchar * lpBuffer){
    for (;*lpBuffer;lpBuffer++)    {
        if( (*lpBuffer>=0xC0) )    {
            *lpBuffer-=*lpBuffer<=0xEF?0x40:0x10;
        }
    }
}

Автор: BigHeart 19.3.2007, 13:15
Код

#include<iostream>
#include<stdlib.h>
#include<time.h>
#include<conio.h>
using namespace std;
char *WinToDos(const char *str1,char *str2)
      
{
    int i=0;
    for(;str1[i]!='\0';i++)
    {
        if((str1[i]>'a')&&(str1[i]<='п'))
            str2[i]=str1[i+192];
            
        else if((str1[i]>='p')&&(str1[i]<='я'))
           str2[i]=str1[i]+240;
        else
            str2[i]=str1[i];
    }
     str2[i]='\0';
     return str2;
    
}
void main()
{
    char str1[100];
    char str2[100];
    cin>>str1;
    cout<<WinToDos(str1,str2);
    
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)