Как переконвертить в C++ Builder строку в 866 кодировку
От: lightix  
Дата: 20.02.03 13:06
Оценка:
Подскажите, как можно переконвертировать строку из 1251 кодировки в 866 и наоборот?
Если стандартных функций нет, то подскажите хотя бы диапазон кодов русских букв для обеих кодировок соответственно.
Заранее благодарен.
Re: Как переконвертить в C++ Builder строку в 866 кодировку
От: Unman Украина  
Дата: 20.02.03 13:34
Оценка:
Здравствуйте, lightix, Вы писали:

L>Подскажите, как можно переконвертировать строку из 1251 кодировки в 866 и наоборот?

L>Если стандартных функций нет, то подскажите хотя бы диапазон кодов русских букв для обеих кодировок соответственно.
L>Заранее благодарен.

Здорово:
попользуй API-функции типа
BOOL CharToOem
( LPCTSTR lpszSrc, // pointer to string to translate
LPSTR lpszDst // pointer to translated string
);
+ там ещё парочка похожих: по данной ссылке в хелпе посмотришь.
Заметка: OEM — это и есть DOS кодировочка
Из протокола следствия: на обследование направляется труп без признаков смерти, в кармане трупа дискета — видимо, труп компьютерный..
Re: Как переконвертить в C++ Builder строку в 866 кодировку
От: Sinclair Россия https://github.com/evilguest/
Дата: 20.02.03 13:39
Оценка:
Здравствуйте, lightix, Вы писали:

L>Подскажите, как можно переконвертировать строку из 1251 кодировки в 866 и наоборот?

CharToOem()
... << RSDN@Home 1.0 beta 6 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Как переконвертить в C++ Builder строку в 866 кодиров
От: lightix  
Дата: 20.02.03 13:56
Оценка:
U>попользуй API-функции типа
U>BOOL CharToOem
Спасибо, действительно помогла
А не подскажете заодно как красиво AnsiString в char * конвертнуть?
Я пишу вот так:
AnsiString Text="текст который надо конвертить"
char Src[200];
char Dst[200];
sprintf(Src,"%s",Text);
 CharToOem(Src,Dst);
Text=Dst;

Но ведь в этом случае я ограничиваю длину строки 200 симв.
Можно как-то покрасивее это написать?
Re: Как переконвертить в C++ Builder строку в 866 кодировку
От: Hacker_Delphi Россия  
Дата: 20.02.03 14:01
Оценка:
Здравствуйте, lightix, Вы писали:

L>Подскажите, как можно переконвертировать строку из 1251 кодировки в 866 и наоборот?

L>Если стандартных функций нет, то подскажите хотя бы диапазон кодов русских букв для обеих кодировок соответственно.
L>Заранее благодарен.
windows.h:
OemToAnsi/AnsiToOem
silent
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[3]: Как переконвертить в C++ Builder строку в 866 кодиров
От: Sinclair Россия https://github.com/evilguest/
Дата: 20.02.03 14:09
Оценка:
Здравствуйте, lightix, Вы писали:

U>>попользуй API-функции типа

U>>BOOL CharToOem
L>Спасибо, действительно помогла
L>А не подскажете заодно как красиво AnsiString в char * конвертнуть?
L>Я пишу вот так:
...
L>Но ведь в этом случае я ограничиваю длину строки 200 симв.
L>Можно как-то покрасивее это написать?
Ну и зря ты так пишешь. Так писать — нарываться на Buffer Overrun.
Надо примерно так:
AnsiString AnsiStringToOem(AnsiString a)
{
  char * tmp=new char[a.length+1];
  CharToOem(a, tmp);
  AnsiString res = tmp;
  delete[] tmp;
  return res;
}

не уверен насчет a.length — сам я на дельфи пишу. Но смысл понятен (я надеюсь
... << RSDN@Home 1.0 beta 6 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Как переконвертить в C++ Builder строку в 866 кодиров
От: Sinclair Россия https://github.com/evilguest/
Дата: 20.02.03 14:09
Оценка:
Здравствуйте, Hacker_Delphi, Вы писали:
HD>windows.h:
HD>OemToAnsi/AnsiToOem
Deprecated
... << RSDN@Home 1.0 beta 6 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[3]: Как переконвертить в C++ Builder строку в 866 кодиров
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 20.02.03 14:09
Оценка:
Здравствуйте, lightix, Вы писали:

U>>попользуй API-функции типа

U>>BOOL CharToOem
L>Спасибо, действительно помогла
L>А не подскажете заодно как красиво AnsiString в char * конвертнуть?


Можно так:

AnsiString Text = "текст который надо конвертить";

char* Dst = new char[Text.Length()+1];

CharToOem(Text.c_str(),Dst);

Text = Dst;
delete [] dst;
Re[3]: Как переконвертить в C++ Builder строку в 866 кодиров
От: chia Россия  
Дата: 20.02.03 14:14
Оценка:
Здравствуйте, lightix, Вы писали:

U>>попользуй API-функции типа

U>>BOOL CharToOem
L>Спасибо, действительно помогла
L>А не подскажете заодно как красиво AnsiString в char * конвертнуть?
L>Я пишу вот так:
L>
L>AnsiString Text="текст который надо конвертить"
L>char Src[200];
L>char Dst[200];
L>sprintf(Src,"%s",Text);
L> CharToOem(Src,Dst);
L>Text=Dst;
L>

L>Но ведь в этом случае я ограничиваю длину строки 200 симв.
L>Можно как-то покрасивее это написать?
Если в тексте могут быть символы \0 (#0), то надо использовать CharToOemBuf
и вообще, имхо, лучше использовать перкодировку именно в с такой ф-й.
Re[4]: Как переконвертить в C++ Builder строку в 866 кодиров
От: lightix  
Дата: 20.02.03 14:20
Оценка:
Здравствуйте, chia, Вы писали:

C>Если в тексте могут быть символы \0 (#0), то надо использовать CharToOemBuf

C>и вообще, имхо, лучше использовать перкодировку именно в с такой ф-й.

А чем она отличается и какой ее синтаксис?
Re[5]: Как переконвертить в C++ Builder строку в 866 кодиров
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 20.02.03 14:29
Оценка:
Здравствуйте, lightix, Вы писали:


C>>Если в тексте могут быть символы \0 (#0), то надо использовать CharToOemBuf

C>>и вообще, имхо, лучше использовать перкодировку именно в с такой ф-й.

L>А чем она отличается и какой ее синтаксис?



BOOL CharToOemBuff(

LPCTSTR lpszSrc, // pointer to string to translate
LPSTR lpszDst, // pointer to translated string
DWORD cchDstLength // length of string to translate, in characters
);

Re: Как переконвертить в C++ Builder строку в 866 кодировку
От: Spark  
Дата: 20.02.03 14:44
Оценка:
Здравствуйте, lightix, Вы писали:

L>Подскажите, как можно переконвертировать строку из 1251 кодировки в 866 и наоборот?


Используй стандартные API-шные ф-ции: CharToOem (1251->866) и OemToChar (866->1251).
... << RSDN@Home 1.0 beta 6a >>
Re[2]: Как переконвертить в C++ Builder строку в 866 кодиров
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 20.02.03 15:19
Оценка:
Здравствуйте, Spark, Вы писали:

[]
S>Используй стандартные API-шные ф-ции: CharToOem (1251->866) и OemToChar (866->1251).

Позвольте поинтересоваться — а вы ответы выше вашего топика видели?
Re[3]: Как переконвертить в C++ Builder строку в 866 кодиров
От: Spark  
Дата: 21.02.03 09:39
Оценка:
Здравствуйте, Flamer, Вы писали:
F>Позвольте поинтересоваться — а вы ответы выше вашего топика видели?

Да у меня RSDN@Home & dialup После очередной синхронизации появился вопрос, а ответов небыло. Ну я и ответил человеку. Когда засинхронизился в очередной раз — там уже 2 ответа, кроме моего
... << RSDN@Home 1.0 beta 6a >>
Re[4]: Как переконвертить в C++ Builder строку в 866 кодиров
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 21.02.03 11:45
Оценка:
Здравствуйте, Spark, Вы писали:

[]
S>Да у меня RSDN@Home & dialup

Понял, не дурак... Примите мои извинения
Re: Как переконвертить в C++ Builder строку в 866 кодировку
От: Mozart Россия  
Дата: 24.02.03 21:40
Оценка:
Здравствуйте, lightix, Вы писали:

А можно по-спортивному:
inline unsigned char Oem2Ansi(unsigned char c)
{
    if (c == 0xf8) c = '°';
    if (c==241) c=184; else
    if (c==240) c=168; else
    if ((c>127 && c<160)||(c>159 && c<176)) c=c+64; else
    if (c>223 && c<240) c=c+16;
    return c;
}


Аналогично можно написать и в обратную сторону.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.