Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.133.144.217] |
|
Сообщ.
#1
,
|
|
|
Подскажите пожалуйста!
Как вывести в окно Unicode файл в Visual C++ 6? Заранее благодарен Алексей |
Сообщ.
#2
,
|
|
|
WideCharToMultibyte() и MultibyteToWideChar()
|
Сообщ.
#3
,
|
|
|
Присоединюсь к вопросу.
До конверсии дело не доходит еще. Уже при чтении Unicod-овского файла у меня лажа получается. Как бы мне помочь? |
Сообщ.
#4
,
|
|
|
А в чем трабла то?
чем файл читаем в какой буффер на чем зависаем? |
Сообщ.
#5
,
|
|
|
Да вот так:
#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. |
Сообщ.
#6
,
|
|
|
Пропадает куда?
нет в буффере или при выводе буффера ничего не кажет? Вообще в двоичной моде никаких преобразований функции чтения не делают. |
Сообщ.
#7
,
|
|
|
Где-то в комментариях к этим функциям (казись MSN лопатил) есть коментарий к этим функциям, так там указано, что при указании текст-моды чтение производится как multybyte,
а при указании бинарной -- как wchar. У меня же на экран нифига русского не попадает. |
Сообщ.
#8
,
|
|
|
А вообще вопрос был очень простой -- как же все-таки прочитать файл в Unicode стандартными средсвами (и преобразовать его скажем в 1251). Просто привести кусочек кода. Больше ничего не надо. Я и так догадываюсь, что у меня что-то неправильно написано.
|
Сообщ.
#9
,
|
|
|
А после чтения ты буффер смотрел? с файлом сравнивал?
Скорее всего трабла в выводе на экран Копай там - выводиш какими методами? |
Сообщ.
#10
,
|
|
|
migel, ну чего ты спрашиваешь как я делаю?
напиши как надо делать и боле ничего. как я выводил, я привел пример, смотри выше. кстати, посмотрел, вообще ничего читать не хочет - NULL возвращает fgetws |
Сообщ.
#11
,
|
|
|
вдогонку - про fgetws я лажу написал.
читает она, но в буфер гонит пургу. |
Сообщ.
#12
,
|
|
|
Чудак человек, какой код я тебе приведу, если такой же у меня работает правильно Ж-(
И не надо нарываться на грубости что в буфер не совпадает с файлом? |
Сообщ.
#13
,
|
|
|
Чтение из файла не при чем -все читается нормально.
А для операционки тебе просто нужно установить локаль вывода консольного окна. setlocale(LC_ALL, "rus_rus.OCP"); Если не поможет то поиграйся кодовыми страничками. |
Сообщ.
#14
,
|
|
|
Вроде старался не грубить.
Если что не так -- сорри. К делу, два варианта поведения: 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? или это какая-то левятина затесалась? |
Сообщ.
#15
,
|
|
|
Значит дело такое:
юникодный файл в кодировке 1251 читается на ура - именно в бинарной моде. Второе именно так, но надо ставить нужную локаль. wcstombs(strTmp, (const wchar_t *) tstr, sizeof(strTmp)); Третье скорее всего да - но я не уверен |
Сообщ.
#16
,
|
|
|
Привет,
Unicode это такая здоровая таблица символов зазмером 65000 примерно, потому используется по два байта на символ. Первые 127 символов совпадают с обычной ASCII таблицей, а дальше интернациональные наборы, и к примеру русский набор находится по адресу XX (сам не знаю по какому, но факт то, что ты зная это смещение можешь, перевести уникоды в ASCII просто от адреса отнять смещение и прибавить 127 так кажется, просто выяснить с какого адреса они начинаются, на домашней странице UNICODE есть транслирующие таблицы специально для такого случая. Они состоят из таблицы UNICODE - ASCII, я грузил ее в память, а все надо было под юниксом делать, а потом просто сличал. |
Сообщ.
#17
,
|
|
|
Тогда у меня подозрение, что у меня из-за неверно выставленной локали и не читается.
Выставлена по умолчанию та самая "С" локаль. Я уже писал про это. Какая должна быть для 1251? |
Сообщ.
#18
,
|
|
|
to the_moon:
я понимаю, что обойти все это дело можно, вручную привести в 1251 - тоже, но мне теперь интересно просто как это делается по нормальному _стандартными средствами_. |
Сообщ.
#19
,
|
|
|
Попробуй ту что я тебе приводил
LC_ALL, "rus_rus.OCP" причем OCP = 866 зависит от того куда та хочеш выводить - если в консоль то ОЕМ кодировка (в НТ по моему можно и другую в консоль впендюрить ...) а ежели в ГУИ то нужно 1251 или вообще ничего не указывай кроме "rus_rus" |
Сообщ.
#20
,
|
|
|
Блин!
Долбаный борланд! Это только он эти локали не понимает. Попробовал на VC. Заработало вроде. Спасибо, migel! |