Юникодный файл

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Cytron
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 266
Зарегистрирован: 15.02.2007 (Чт) 21:09

Юникодный файл

Сообщение Cytron » 29.11.2007 (Чт) 20:11

Итак, к делу:
Стандартный блокнот может сохранять файлы в четырех кодировках:
ANSI
UNICODE
UNICODE BIG ENDIAN
UTF-8
Как можно из VB читать/писать файлы в этих кодировках.
Нужно так, чтобы прога была совместима с блокнотом.
Поддержка Unicode у меня в проге есть.
Заранее спасибо.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 29.11.2007 (Чт) 20:59

Значится так. Работаем с файлом апями, данные объявляем как As Any, но обязательно через Declare(с тлб проблемы). Для чтения/записи ANSI строку передаём как ByVal s, как UNICODE - ByVal StrPtr(s). С Big Endian немного сложнее - надо читать в массив байт, менять местами чётные и нечётные байты, после чего сделать s=bytearray, т. е. приравнять строку к массиву. UTF-8, вроде, только через API-конвертилки.
Изображение

Cytron
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 266
Зарегистрирован: 15.02.2007 (Чт) 21:09

Сообщение Cytron » 29.11.2007 (Чт) 21:18

А нельзя ли просто конвертить а потом записывать как простой файл простыми VB шными командами?
Просто если в блокноте что-нибудь напечатать а потом сохранить как Unicode, то потом если этот файл читать из VB и использовать StrConv то будут отображаться каракули. Тоесть строка в файле не просто в Unicode а с каким-то заголовком как я понял. Как блокнот вообще узнает какая у файла кодировка при его открытии?

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 29.11.2007 (Чт) 22:13

Там первые 1/2/4 байта сигнальные. А читать лучше через ReadFile
Изображение

Cytron
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 266
Зарегистрирован: 15.02.2007 (Чт) 21:09

Сообщение Cytron » 29.11.2007 (Чт) 22:16

Спасибо я попробую через Read/WriteFile. Только Про UTF-8 и BIG ENDIAN можно поподробней?
У меня в программе всё равно всё в Юникоде. Тоесть нам надо просто загружать файл, конвертить его в юникод и отображать. А потом, когда записываешь, обратно из Юникода (если нужно) в ANSI , UTF-8 или Big Endian.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 29.11.2007 (Чт) 23:40

В Big-Endian просто по другому идут байты в символе. Если текст хранится в байт-массиве надо просто поменять местами чётные и нечётные элементы.
Изображение

Cytron
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 266
Зарегистрирован: 15.02.2007 (Чт) 21:09

Сообщение Cytron » 30.11.2007 (Пт) 0:02

Да это я уже понял. А есть пример Unicode>UTF8 и обратно?
Получается кстати что в блокноте нельзя создать файл начинающийся на FF FE (яю, заголовок Unicode) или FE FF (юя, заголовок Unicode Big Endian). Вернее можно, но они против твоей воли будут не в ANSI а в UNICODE.

Cytron
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 266
Зарегистрирован: 15.02.2007 (Чт) 21:09

Сообщение Cytron » 30.11.2007 (Пт) 23:48

Ну что, никто не знает как все-таки делать конверт из Unicode в UTF-8 и обратно?

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2056
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 01.12.2007 (Сб) 0:16

В крайнем случае можно поюзать тот же ADODB.Stream. Он вроде как понимает все кодировки которые есть в системе (UTF-8, WINDOWS-1251 и т.п)

Пишет как текстове так и двоичные файлы

Cytron
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 266
Зарегистрирован: 15.02.2007 (Чт) 21:09

Сообщение Cytron » 01.12.2007 (Сб) 0:21

Да ненужен мне в простой заурядной программе ADODB! :cry:

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 03.12.2007 (Пн) 10:48

MultiByteToWideChar.

keks-n, те байты именуются BOM'ом (Byte Order Mark).
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13

    TopList