WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Как считать UNICODE файл?

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Как считать UNICODE файл?
Alexei Iakovlev опубликован 16-10-2000 13:32 MSK   Click Here to See the Profile for Alexei Iakovlev   Click Here to Email Alexei Iakovlev  
Подскажите пожалуйста!
Как вывести в окно Unicode файл в Visual C++ 6?
Заранее благодарен
Алексей
Rush опубликован 11-12-2000 04:36 MSK     Click Here to See the Profile for Rush  Click Here to Email Rush     
WideCharToMultibyte() и MultibyteToWideChar()
Valery опубликован 17-10-2000 15:12 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
Присоединюсь к вопросу.
До конверсии дело не доходит еще.
Уже при чтении Unicod-овского файла
у меня лажа получается.
Как бы мне помочь?
migel опубликован 17-10-2000 15:33 MSK     Click Here to See the Profile for migel  Click Here to Email migel     
А в чем трабла то?
чем файл читаем в какой буффер на чем зависаем?
Valery опубликован 18-10-2000 09:51 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
Да вот так:
#include <stdio.h>
int main ()
{
FILE *in;
in = _wfopen(L"backup2000.log", L"rb");
wchar_t buf[1000];
while (!feof(in))
{
fgetws(buf, sizeof buf, in);
wprintf(L"%s\n", buf);
}
fclose(in);
}
Вся русская часть уникодовского файла при этом пропадает. Догадываюсь что что-то с setlocale не так, но насколько я понял, что в борланде, что в визуале она(setlocale) поддерживает только некую "C" locale.

migel опубликован 18-10-2000 10:45 MSK     Click Here to See the Profile for migel  Click Here to Email migel     
Пропадает куда?
нет в буффере или при выводе буффера ничего не кажет?
Вообще в двоичной моде никаких преобразований функции чтения не делают.
Valery опубликован 18-10-2000 11:14 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
Где-то в комментариях к этим функциям (казись MSN лопатил) есть коментарий к этим функциям, так там указано, что при указании текст-моды чтение производится как multybyte,
а при указании бинарной -- как wchar.
У меня же на экран нифига русского не попадает.
Valery опубликован 18-10-2000 11:18 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
А вообще вопрос был очень простой -- как же все-таки прочитать файл в Unicode стандартными средсвами (и преобразовать его скажем в 1251). Просто привести кусочек кода. Больше ничего не надо. Я и так догадываюсь, что у меня что-то неправильно написано.
migel опубликован 18-10-2000 12:03 MSK     Click Here to See the Profile for migel  Click Here to Email migel     
А после чтения ты буффер смотрел? с файлом сравнивал?
Скорее всего трабла в выводе на экран Копай там - выводиш какими методами?
Valery опубликован 18-10-2000 13:13 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
migel, ну чего ты спрашиваешь как я делаю?
напиши как надо делать и боле ничего.
как я выводил, я привел пример, смотри выше.
кстати, посмотрел, вообще ничего читать не хочет - NULL возвращает fgetws :(
Valery опубликован 18-10-2000 13:19 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
вдогонку - про fgetws я лажу написал.
читает она, но в буфер гонит пургу.
migel опубликован 18-10-2000 13:23 MSK     Click Here to See the Profile for migel  Click Here to Email migel     
Чудак человек, какой код я тебе приведу, если такой же у меня работает правильно Ж-(
И не надо нарываться на грубости
что в буфер не совпадает с файлом?
migel опубликован 18-10-2000 14:03 MSK     Click Here to See the Profile for migel  Click Here to Email migel     
Чтение из файла не при чем -все читается нормально.
А для операционки тебе просто нужно установить локаль вывода консольного окна.
setlocale(LC_ALL, "rus_rus.OCP");
Если не поможет то поиграйся кодовыми страничками.
Valery опубликован 18-10-2000 14:05 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
Вроде старался не грубить. :(
Если что не так -- сорри.
К делу, два варианта поведения:
1. in = _wfopen(L"aaa.txt", L"rb");
Выцепилось следующее - fgetws читает строку из файла, пока не встретит любой русский символ, отсекает начиная с него весь остаток строки.
2. in = _wfopen(L"aaa.txt", L"rt");
fgetws читает строку из файла как набор char, преобразует их в wchar_t, в результате - полная галиматья.

Интересно было бы разобраться именно с первым случаем, он, мне кажется ближе к истине.
Кстати преобразовать в char* чем надо? wcstombs? или это другая музыка?

И последнее - в самом начале файла 0xFEFF -- это признак того, что файл в Unicode? или это какая-то левятина затесалась?

migel опубликован 18-10-2000 15:28 MSK     Click Here to See the Profile for migel  Click Here to Email migel     
Значит дело такое:
юникодный файл в кодировке 1251 читается на ура - именно в бинарной моде.

Второе
именно так, но надо ставить нужную локаль.
wcstombs(strTmp, (const wchar_t *) tstr, sizeof(strTmp));

Третье скорее всего да - но я не уверен

the_moon опубликован 18-10-2000 15:35 MSK     Click Here to See the Profile for the_moon  Click Here to Email the_moon     
Привет,

Unicode это такая здоровая таблица символов зазмером 65000 примерно, потому используется по два байта на символ. Первые 127 символов совпадают с обычной ASCII таблицей, а дальше интернациональные наборы, и к примеру русский набор находится по адресу XX (сам не знаю по какому, но факт то, что ты зная это смещение можешь, перевести уникоды в ASCII просто от адреса отнять смещение и прибавить 127 так кажется, просто выяснить с какого адреса они начинаются, на домашней странице UNICODE есть транслирующие таблицы специально для такого случая. Они состоят из таблицы UNICODE - ASCII, я грузил ее в память, а все надо было под юниксом делать, а потом просто сличал.

Valery опубликован 18-10-2000 15:38 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
Тогда у меня подозрение, что у меня из-за неверно выставленной локали и не читается.
Выставлена по умолчанию та самая "С" локаль.
Я уже писал про это. Какая должна быть для 1251?
Valery опубликован 18-10-2000 15:41 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
to the_moon:
я понимаю, что обойти все это дело можно, вручную привести в 1251 - тоже, но мне теперь интересно просто как это делается по нормальному _стандартными средствами_.
migel опубликован 18-10-2000 16:12 MSK     Click Here to See the Profile for migel  Click Here to Email migel     
Попробуй ту что я тебе приводил
LC_ALL, "rus_rus.OCP"
причем OCP = 866
зависит от того куда та хочеш выводить - если в консоль то ОЕМ кодировка (в НТ по моему можно и другую в консоль впендюрить ...)
а ежели в ГУИ то нужно 1251 или вообще ничего не указывай кроме "rus_rus"
Valery опубликован 18-10-2000 16:44 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
Блин!
Долбаный борланд!
Это только он эти локали не понимает.
Попробовал на VC. Заработало вроде.
Спасибо, migel!


СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.