Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > из UNICODE в ANSI


Автор: nikakoi 22.5.2006, 09:30
Добрый день.
У меня вот какая проблема... пишу програмку для сохранения текста в файл для КПК...
без использования Unicode она жутко ругается=)
а с использованием полученный файл открывается вроде не в Unicode, а в ANSI(или ASCI(не уверен как правильно назвать-)))
Подскажите как мне конвертануть текст, чтобы читабельно было?  

Автор: _hunter 22.5.2006, 11:10
MultiByteToWideChar?   

Автор: Earnest 22.5.2006, 11:49
Ты что-то путаешь. Открывается файл всегда одинаково. Ну разве что в текстовом или бинарном режиме, к UNICODE это отношения не имеет. Если ты пишешь в файл UNICODE-строки, то их в файле и имеешь. И выглядят они при открытии в чем-нибудь неподходящем, конечно, странновато. И читать нужно тоже UNICODE-строки, разумеется.
Однако никто не мешает писать в файл "обычные" строки, даже если программа UNICODE. Так что, пожалуйста, изложи конкретнее, что имеено ты хочешь, и что у тебя не получается. 

Автор: nikakoi 22.5.2006, 12:09
Не уверен, что конкретнее получится..
Получил файл с юникодными строками(а точнее там всего одна строка.)... Открываю на КПК... после каждого символа стоит квадрат..
Открываю в винде этот же фаил - квадраты встречаются везде где было \n...
а в FAR'е все вообще замечательно работает - фаил открывается нормально, никаких квадратов нет...  

Автор: Earnest 22.5.2006, 12:54
Самая главная проблема программиста (да и любого специалиста) - вовсе не отсутствие каких-то знаний, а каша в голове.
Что значит "открываю на КПК"? Это девочка-секретарша так сказать имеет право. 
Файл открывается не на компьютере, а в какой-то программе. Причем каждая программа как-то его читает и интерпретирует. FAR умеет понять, что файл записан в UNICODE, и соответственно интерпретирует показываемые строки. Windows обычно тоже умеет, хотя это зависит от версии. Квадраты после каждого символа - так некоторые текстовые редакторы показывают то, чего не знают. В данном случае нули в начале каждого широкого символа. Так что нормальный у тебя UNICODE файл.
Так что ты хочешь-то? Чтобы просмотрщик, который ты в КПК используешь, нормально UNICODE-файлы читал? Так это к Биллу Гейтсу претензии... smile  Или все-таки ты хочешь получить простой ASCII файл, который любой самый древний редактор нормально прочитает? Так и пиши туда ASCII-строки.
Цитата(nikakoi @  22.5.2006,  10:30 Найти цитируемый пост)
без использования Unicode она жутко ругается=)

Матом, наверное, раз постеснялся написать конкретно...
 

Автор: nikakoi 22.5.2006, 12:58
ну все=) унизили и обиделиsmile(вот так и задавай вопросы)
нет не матом... 
D:\Microsoft Visual Studio 8\VC\ce\atlmfc\include\afxv_w32.h(227) : fatal error C1083: Cannot open include file: 'mbctype.h': No such file or directory

вот что выдает...

а по поводу секретаршиsmile...ну я особо не задумывался, какой именно прогой на КПК открываются файлы...

 да и вообще я только учусь...

а CString'и они в ASCII бывают?? я все ими сделал просто  

Автор: Earnest 22.5.2006, 13:27
Не обижайся, я любя  smile И по-моему, по делу...
Между прочим, ты так и не сказал конкретно, в чем проблема. А правильно поставленный вопрос - это уже половина решения... 

CString - это макрос, который либо CStringA, либо CStringW, в зависимости от того, как скомпилирована программа - UNICODE или нет.
Во-первых, можно пользоваться конкретным типом (т.е. CStringA).
Во-вторых, если тебе нужен файл для KПK, то зачем тебе UNICODE?

Из твоих объяснений я поняла, что не-UNICODE программу тебе сделать не удается. Так первым делом с этим надо разобраться, потому как нехорошо это. Судя по всему 8-я студия сразу по умолчанию ставит использование UNICODE.

Вот тут я тебе ничего конкретно сказать не могу, т.к. у меня VS 2003, и для КПК я никогда не писала, а ты, похоже, как-то специально проект настраивал именно под програмирование КПК? (Путь в ошибке какой-то странный: ...VC\ce\atlmfc\include... - что там за "ce"?).
Так вот, сначала нужно разобраться, вдруг правда нельзя не-UNICODE программы писать для КПК? (сомнительно, честно говоря). Попробовать сделать проект заново, указав опцию "использовать MultiByte".
А может у тебя просто пути к инклуд-каталогам неправильно настроены?

 

Автор: CaptainFlint 23.5.2006, 17:20
Цитата(Earnest @  22.5.2006,  14:27 Найти цитируемый пост)
Во-вторых, если тебе нужен файл для KПK, то зачем тебе UNICODE?

Если не ошибаюсь, Windows Mobile - юникодная система... 

Автор: Earnest 23.5.2006, 18:21
Тогда непонятно, почему оно UNICODE-файлы не читает нормально. 

Автор: CaptainFlint 23.5.2006, 18:29
Earnest, так ведь ещё не ясно, что за программа, как написана и т.д. Может же юникодная программа быть написана так, что читает только ANSI-файлы. Например, если пишется с использованием char'ов, а не TCHAR'ов... Код нужон...

PS: Эх, жаль, так до сих пор и не выбрал времени поиграться с программированием под КПК... smile 

Автор: Earnest 23.5.2006, 18:40
Мне казалось из контекста вопросов, что для чтения используется что-то стандартное, а не самопал:
Цитата(nikakoi @  22.5.2006,  13:09 Найти цитируемый пост)
Открываю на КПК

- про свою программу так обычно не говорят...

Ждем аффтара... 

Автор: nikakoi 24.5.2006, 10:29
Аффтар тут=))
Я использую Cstring'и, как и писал в начале...
Код

  CStdioFile file;
  CString path = "test.txt";
  file.Open(path, CFile::modeWrite | CFile::modeCreate, NULL);
  CString string = "GetDeviceCaps: \n\n";
  string += "PresentationIntervals:   \n";
  file.WriteString(string);
. 
Вот в карце текст программкиsmile 

А открываю txt файл обычным WordMobile'ом(кажется он так называется)  

Автор: Earnest 24.5.2006, 10:40
Проверь, читает ли этот Вордомобиль какие-нибудь другие файлы UNICODE (не твои). 
Если читает нормально, значит, надо искать, чем твои порождения отличаются.
Если не читает, значит пиши не-UNICODE. Т.е. используй CStringA.

Кстати, записывать файлы в тестовом режиме не пробовал? Может ему просто \r\n не хватает для счастья?
В смысле, по-моему по умолчанию там бинарный режим, а для текстового нужно указать что-то вроде modeText. 

Автор: nikakoi 24.5.2006, 10:49
В винде делал юникод файл(текстовыйsmile)... скопировал на КПК... ВордоМобильsmile читал правильно..
CStringA и modeText  я не пробовал...
Надеюсь вечером потестю...
 

Автор: CaptainFlint 24.5.2006, 12:53
Судя по тексту программы, она собрана в режиме ANSI, поскольку строки написаны без L и без _T(). Значит, CString ранслируется в CStringA (как и все API-вызовы). Если сопоставить с этим первый пост темы, как-то странно всё это выглядит... 

Автор: mostly 24.5.2006, 14:56
Цитата(nikakoi @ 22.5.2006,  12:58)
D:\Microsoft Visual Studio 8\VC\ce\atlmfc\include\afxv_w32.h(227) : fatal error C1083: Cannot open include file: 



D:\Microsoft Visual Studio 8\VC\ce\atlmfc\include\afxv_w32.h
                   ^        ^        ^
Пробелы в имени каталога. 

Автор: Earnest 24.5.2006, 15:30
Цитата(CaptainFlint @  24.5.2006,  13:53 Найти цитируемый пост)
Судя по тексту программы, она собрана в режиме ANSI, поскольку строки написаны без L и без _T(). 

Не обязательно. CString умеет делать преобразования... у нее там куча шаблонных конструкторов ...

Добавлено @ 15:35 
Цитата(mostly @  24.5.2006,  15:56 Найти цитируемый пост)
Пробелы в имени каталога.  

И что? Это давно не проблема. У меня, например, такой путь: C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7... 

Автор: CaptainFlint 24.5.2006, 19:25
Цитата(Earnest @  24.5.2006,  16:30 Найти цитируемый пост)
Не обязательно. CString умеет делать преобразования... у нее там куча шаблонных конструкторов ...

ANSI в Unicode - не умеет.
Код
    CString str = "test";

вот результат компиляции:
Цитата
------ Build started: Project: test, Configuration: Debug Win32 ------
Compiling...
stdafx.cpp
Compiling...
test.cpp
d:\!nonwork\! programs\ztemp\vc8\test\test.cpp(35) : error C2440: 'initializing' : cannot convert from 'const char [5]' to 'ATL::CStringT<BaseType,StringTraits>'
        with
        [
            BaseType=wchar_t,
            StringTraits=StrTraitMFC_DLL<wchar_t>
        ]
        Constructor for class 'ATL::CStringT<BaseType,StringTraits>' is declared 'explicit'
        with
        [
            BaseType=wchar_t,
            StringTraits=StrTraitMFC_DLL<wchar_t>
        ]
Build log was saved at "file://d:\!NonWork\! Programs\ZTemp\vc8\test\Debug\BuildLog.htm"
test - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Это на восьмёрке, проект - консольное Windows-приложение с поддержкой MFC (Юникод включён по умолчанию). 

Автор: Damarus 24.5.2006, 23:54
nikakoi, у меня два предложения:
1. Попробуй в самом начале создаваемого файла писать \uFFFE. Т.е.:
Код

CStdioFile file;
CString path = L"test.txt";
file.Open(path, CFile::modeWrite | CFile::modeCreate, NULL);
CString string = L"\uFFFEGetDeviceCaps: \n\n";
string += L"PresentationIntervals:   \n";
file.WriteString(string);


2. В винде (что мобильной, что обычной) лучше писать не "\n", а "\r\n". 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)