Автор
|
Тема: Как считать UNICODE файл?
|
Alexei Iakovlev |
опубликован 16-10-2000 13:32 MSK
Подскажите пожалуйста! Как вывести в окно Unicode файл в Visual C++ 6? Заранее благодарен Алексей
|
Rush
|
опубликован 11-12-2000 04:36 MSK
WideCharToMultibyte() и MultibyteToWideChar() |
Valery
|
опубликован 17-10-2000 15:12 MSK
Присоединюсь к вопросу. До конверсии дело не доходит еще. Уже при чтении Unicod-овского файла у меня лажа получается. Как бы мне помочь? |
migel
|
опубликован 17-10-2000 15:33 MSK
А в чем трабла то? чем файл читаем в какой буффер на чем зависаем? |
Valery
|
опубликован 18-10-2000 09:51 MSK
Да вот так: #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
Пропадает куда? нет в буффере или при выводе буффера ничего не кажет? Вообще в двоичной моде никаких преобразований функции чтения не делают. |
Valery
|
опубликован 18-10-2000 11:14 MSK
Где-то в комментариях к этим функциям (казись MSN лопатил) есть коментарий к этим функциям, так там указано, что при указании текст-моды чтение производится как multybyte, а при указании бинарной -- как wchar. У меня же на экран нифига русского не попадает. |
Valery
|
опубликован 18-10-2000 11:18 MSK
А вообще вопрос был очень простой -- как же все-таки прочитать файл в Unicode стандартными средсвами (и преобразовать его скажем в 1251). Просто привести кусочек кода. Больше ничего не надо. Я и так догадываюсь, что у меня что-то неправильно написано. |
migel
|
опубликован 18-10-2000 12:03 MSK
А после чтения ты буффер смотрел? с файлом сравнивал? Скорее всего трабла в выводе на экран Копай там - выводиш какими методами? |
Valery
|
опубликован 18-10-2000 13:13 MSK
migel, ну чего ты спрашиваешь как я делаю? напиши как надо делать и боле ничего. как я выводил, я привел пример, смотри выше. кстати, посмотрел, вообще ничего читать не хочет - NULL возвращает fgetws :( |
Valery
|
опубликован 18-10-2000 13:19 MSK
вдогонку - про fgetws я лажу написал. читает она, но в буфер гонит пургу. |
migel
|
опубликован 18-10-2000 13:23 MSK
Чудак человек, какой код я тебе приведу, если такой же у меня работает правильно Ж-( И не надо нарываться на грубости что в буфер не совпадает с файлом?
|
migel
|
опубликован 18-10-2000 14:03 MSK
Чтение из файла не при чем -все читается нормально. А для операционки тебе просто нужно установить локаль вывода консольного окна. setlocale(LC_ALL, "rus_rus.OCP"); Если не поможет то поиграйся кодовыми страничками.
|
Valery
|
опубликован 18-10-2000 14:05 MSK
Вроде старался не грубить. :( Если что не так -- сорри. К делу, два варианта поведения: 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
Значит дело такое: юникодный файл в кодировке 1251 читается на ура - именно в бинарной моде.Второе именно так, но надо ставить нужную локаль. wcstombs(strTmp, (const wchar_t *) tstr, sizeof(strTmp)); Третье скорее всего да - но я не уверен |
the_moon
|
опубликован 18-10-2000 15:35 MSK
Привет,Unicode это такая здоровая таблица символов зазмером 65000 примерно, потому используется по два байта на символ. Первые 127 символов совпадают с обычной ASCII таблицей, а дальше интернациональные наборы, и к примеру русский набор находится по адресу XX (сам не знаю по какому, но факт то, что ты зная это смещение можешь, перевести уникоды в ASCII просто от адреса отнять смещение и прибавить 127 так кажется, просто выяснить с какого адреса они начинаются, на домашней странице UNICODE есть транслирующие таблицы специально для такого случая. Они состоят из таблицы UNICODE - ASCII, я грузил ее в память, а все надо было под юниксом делать, а потом просто сличал. |
Valery
|
опубликован 18-10-2000 15:38 MSK
Тогда у меня подозрение, что у меня из-за неверно выставленной локали и не читается. Выставлена по умолчанию та самая "С" локаль. Я уже писал про это. Какая должна быть для 1251? |
Valery
|
опубликован 18-10-2000 15:41 MSK
to the_moon: я понимаю, что обойти все это дело можно, вручную привести в 1251 - тоже, но мне теперь интересно просто как это делается по нормальному _стандартными средствами_. |
migel
|
опубликован 18-10-2000 16:12 MSK
Попробуй ту что я тебе приводил LC_ALL, "rus_rus.OCP" причем OCP = 866 зависит от того куда та хочеш выводить - если в консоль то ОЕМ кодировка (в НТ по моему можно и другую в консоль впендюрить ...) а ежели в ГУИ то нужно 1251 или вообще ничего не указывай кроме "rus_rus" |
Valery
|
опубликован 18-10-2000 16:44 MSK
Блин! Долбаный борланд! Это только он эти локали не понимает. Попробовал на VC. Заработало вроде. Спасибо, migel!
|