Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / OEM->ANSI / 10 сообщений из 10, страница 1 из 1
20.05.2005, 15:26
    #33077432
KPIIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OEM->ANSI
Не смог найти нигде упоминания - у меня есть текстовЫй файл с OEM (DOS) кодировкой - мне надо ее считать и сделать Ansi - вместе с WInAPi я б воспользовался OEMtoAnsi и т.д. - есть ли какая либо кросс-платформенная библиотека или набор функций заточенных под С\С++?
...
Рейтинг: 0 / 0
21.05.2005, 04:45
    #33078305
Alexander Magnit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OEM->ANSI
KPIISНе смог найти нигде упоминания - у меня есть текстовЫй файл с OEM (DOS) кодировкой - мне надо ее считать и сделать Ansi - вместе с WInAPi я б воспользовался OEMtoAnsi и т.д. - есть ли какая либо кросс-платформенная библиотека или набор функций заточенных под С\С++?

Неужели надо что то суперуниверсальное? ;-)

Если просто перекодировать, то я делал так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
#ifndef UUtilsH
#define UUtilsH
        unsigned char UAnsi2Oem(const unsigned char c);
        unsigned char UOem2Ansi(const unsigned char c);
//---------------------------------------------------------------------------
#endif


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
#include "UUtils.h"

//---------------------------------------------------------------------------


static unsigned char o2a[ 256 ] = {
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
0x2D, 0x2D, 0x2D, 0x7C, 0x2B, 0x7C, 0x7C, 0x2D, 0x2D, 0x7C, 0x7C, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
0x2D, 0x2B, 0x2D, 0x2B, 0x2D, 0x2B, 0x7C, 0x7C, 0x2D, 0x2D, 0x7C, 0x2D, 0x7C, 0x3D, 0x2B, 0x7C,
0x7C, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2B, 0x2B, 0x2D, 0x2D, 0x2D, 0x2D, 0x7C, 0x7C, 0x2D,
0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF,
0xA8, 0xB8, 0xA5, 0xB4, 0xAA, 0xBA, 0xB2, 0xB3, 0xAF, 0xBF, 0xB7, 0xFB, 0xB9, 0xA4, 0xFE, 0xA0
};


// --------------------------------------
// |   | 0 1 2 3 4 5 6 7 8 9 A B C D E F|
// |---|--------------------------------|
// | 00|                                |
// | 01|                                |
// | 02|   ! " # $ % & ' ( ) * + , - . /|
// | 03| 0 1 2 3 4 5 6 7 8 9 : ; < = > ?|
// | 04| @ A B C D E F G H I J K L M N O|
// | 05| P Q R S T U V W X Y Z [ \ ] ^ _|
// | 06| ` a b c d e f g h i j k l m n o|
// | 07| p q r s t u v w x y z { | } ~ |
// | 08| Ђ Ѓ ‚ ѓ „ … † ‡ € ‰ Љ ‹ Њ Ќ Ћ Џ|
// | 09| ђ ‘ ’ “ ” • – — ? ™ љ › њ ќ ћ џ|
// | 0a|   Ў ў Ј ¤ Ґ ¦ § Ё © Є « ¬  ® Ї|
// | 0b| ° ± І і ґ µ ¶ · ё № є » ј Ѕ ѕ ї|
// | 0c| А Б В Г Д Е Ж З И Й К Л М Н О П|
// | 0d| Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я|
// | 0e| а б в г д е ж з и й к л м н о п|
// | 0f| р с т у ф х ц ч ш щ ъ ы ь э ю я|
// --------------------------------------
static unsigned char a2o[ 256 ] = {
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0xFF
, 0xF6, 0xF7, 0x20, 0xFD, 0xF2, 0x7C, 0x20, 0xF0, 0x20, 0xF4, 0x20, 0x20, 0x20, 0x20, 0xF8,
0xF8, 0x20, 0xF6, 0xF7, 0xF3, 0x20, 0x20, 0xFA, 0xF1, 0xFC, 0xF5, 0x20, 0x20, 0x20, 0x20, 0xF9,
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF
};
/*
# Win	 Gost
0xA8	0xF0	# Ё
0xB8	0xF1	# ё
0xA5	0xF2	# Ґ
0xB4	0xF3	# ґ
0xAA	0xF4	# Є
0xBA	0xF5	# є
0xB2	0xF6	# І
0xB3	0xF7	# і
0xAF	0xF8	# Ї
0xBF	0xF9	# ї
*/

unsigned char UOem2Ansi(const unsigned char c)
{
        //TODO: Add your source code here
                return o2a[c];
}

unsigned char UAnsi2Oem(const unsigned char c)
{
        //TODO: Add your source code here
                return a2o[c];
}


Ну еще вызов в цикле функции перекодировки символа.
Лучше конечно написать соответствующий класс.

Все это делалось для перекодировки символов, из ДОСовской (ГОСТовской) кодировки писем в украинском банке в Win-1251.
...
Рейтинг: 0 / 0
23.05.2005, 09:05
    #33079294
synapse
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OEM->ANSI
KPIISНе смог найти нигде упоминания - у меня есть текстовЫй файл с OEM (DOS) кодировкой - мне надо ее считать и сделать Ansi - вместе с WInAPi я б воспользовался OEMtoAnsi и т.д. - есть ли какая либо кросс-платформенная библиотека или набор функций заточенных под С\С++?

а OemToChar() не подойдет?
...
Рейтинг: 0 / 0
23.05.2005, 18:39
    #33080787
KPIIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OEM->ANSI
synapse
а OemToChar() не подойдет?
так она ж WinAPI!
...
Рейтинг: 0 / 0
24.05.2005, 08:01
    #33081171
synapse
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OEM->ANSI
KPIIS synapse
а OemToChar() не подойдет?
так она ж WinAPI!

Извиняюсь невнимательно прочитал пост.
...
Рейтинг: 0 / 0
24.05.2005, 11:45
    #33081649
prof79
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OEM->ANSI
Есть iconv. Перекодирует все что только можно :-). OpenSource.
В линухах идет вместе с осью, в виндах - dll.
...
Рейтинг: 0 / 0
24.05.2005, 23:51
    #33083017
KPIIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OEM->ANSI
prof79Есть iconv. Перекодирует все что только можно :-). OpenSource.
В линухах идет вместе с осью, в виндах - dll.
А нет случайно рабочих примеров - как работать то с ней - а то скачал и получил кучу хидеров но 0 фалйо документации. Кстати dll никаких не было - все в lib
...
Рейтинг: 0 / 0
25.05.2005, 15:41
    #33083751
prof79
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OEM->ANSI
KPIIS
А нет случайно рабочих примеров - как работать то с ней - а то скачал и получил кучу хидеров но 0 фалйо документации. Кстати dll никаких не было - все в lib
Да там всего полно - и длл и либы и исходники, качал буквально пару месяцев назад :-)
А пример.. пжалуйста, только обработку ошибок делай самостоятельно. Нужные инклюды тож самостоятельно. Там еще буст юзается, просто так не скомпилится.
Говорю сразу - код не мой, поентому на критику один ответ: "сделай лучше и выложи" :-)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
	/// для кодировок используется IConv. В виде dll. Поэтому экспортируем из него ф-ции
#define CALL_CONVERSATION __cdecl

	/// тип ф-ции "открытия" кодировки
	typedef void* (CALL_CONVERSATION *IConvOpen)(const char*, const char*);
	/// тип ф-ции перекоирования
	typedef size_t (CALL_CONVERSATION *IConvConvert) (void* cd, const char* * inbuf, 
								size_t *inbytesleft, char* * outbuf, size_t *outbytesleft);
	/// тип ф-ции "закрытия" кодировки
	typedef  int (CALL_CONVERSATION *IConvClose) (void *);
	/// надстройка над IConv
	class Conversator
	{
	private:
		IConvOpen open_;
		IConvConvert convert_;
		IConvClose close_;
		string from_, to_;
		void *data_;
	public:
		/// класс исключений
		class ConversationError:public runtime_error
		{
		public:
			ConversationError(const string &st):runtime_error(st){};
		};
		/// конструктор. Параметры - исходная, целевая кодовые таблицы, указатели на ф-ции перекодирования
		Conversator(const string &from, const string &to, IConvOpen, IConvConvert, IConvClose);
		/// Сконвертить строку
		string DoConversation(const string &st)const;
		/// деструктор
		~Conversator();
	};
.........
Conversator::Conversator(const string &from, const string &to, IConvOpen o, IConvConvert c, IConvClose cl)
				:open_(o), close_(cl), convert_(c), from_(from), to_(to), data_(NULL)
{
	data_=open_(to_.c_str(), from_.c_str());
	if ((long)data_==- 1 )
		throw ConversationError("error opening codetables");
};

string Conversator::DoConversation(const string &st)const
{
	convert_(data_, NULL, NULL, NULL, NULL); 
	size_t inp_size_left=st.length();
	size_t out_size_left= 2 *inp_size_left;//на всякий случай для результата выделяем в 2 раза больше памяти
	size_t real_out_size=out_size_left;

	scoped_array<char> inptr_(new char[inp_size_left]);
	memcpy(inptr_.get(), st.data(), st.length());
	const char *inptr=inptr_.get();

	scoped_array<char> outptr_(new char[out_size_left]);
	char *outptr=outptr_.get();

	string res;
	while(inp_size_left> 0 )
	{
		int i=convert_(data_, &inptr, &inp_size_left, &outptr, &out_size_left);
		int out_done=out_size_left;
		outptr-=out_done;
		if (i==- 1 ) //ошибка
		{
			switch (errno)
			{
			default:
				throw ConversationError("error error handling");
			};
		}
		else
		{
			res+=string(outptr, out_done);
		}
	}
	return res;
};

Conversator::~Conversator()
{
	if (data_)
		close_(data_);
};

...
Рейтинг: 0 / 0
25.05.2005, 15:46
    #33083764
KPIIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OEM->ANSI
а откуда качал если не секрет - просто в лом ставить себе VS только для того чтоб сделать DLL или LIB - я старенькиЙ bcc32 под винду юзаю
...
Рейтинг: 0 / 0
25.05.2005, 15:59
    #33083781
prof79
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OEM->ANSI
кажись отсюда
http://gnuwin32.sourceforge.net/packages/libiconv.htm
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / OEM->ANSI / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]