Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 [Все]   Вниз
  Печать  
Автор Тема: Char To Unicode (C function)  (Прочитано 56341 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Mfcer__
Команда клуба

ru
Offline Offline

« : 12-12-2003 17:30 » 

Как преобразовать строку типа char в юникодную строку типа wchar_t, причем функцией самого Си.
WinAPI функции WideCharToMultiByte не подходят.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 12-12-2003 21:40 » 

Что понимать под "функцией самого Си"?

Unicode имеет размер 2 байта - в старшем хранится номер страницы, а в младшем код символа из этой страницы.
ASCII коды (32..126) конвертятся добавлением нуля (т.е. страница 0). Управляющие ASCII - не помню. Остальные (для некой кодовой страницы - напр. cp1251) можно конвертить табличным способом: создай таблицу wchar_t tab[128] для символов 128..255 и используй так tab[c&0x7f].
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Mfcer__
Команда клуба

ru
Offline Offline

« Ответ #2 : 12-12-2003 23:34 » 

я только что нашкел вот такую функцию mbstowcs
size_t mbstowcs(
   wchar_t *wcstr,
   const char *mbstr,
   size_t count
);
И она вроде работает...  Ага

Цитата

RXL

Спасибо за ответ, как предложил ты сделать куда интересней, но готовая функция уже есть.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 13-12-2003 12:42 » 

Mfcer__, действительно есть  Отлично
Для интересующихся ссылочка:
http://www.linuxdoc.ru/manpages/man3/mbstowcs.3.html
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Mfcer__
Команда клуба

ru
Offline Offline

« Ответ #4 : 13-12-2003 12:58 » 

А не подскажет кто-нибудь еще - есть ли функция которая из ANSII кодировке в ANSI кодировку переводит строку и обратно.  Спасибо.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 13-12-2003 13:39 » 

Немножко подробнее, пожалуйста: что есть "ANSI" кодировка?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Mfcer__
Команда клуба

ru
Offline Offline

« Ответ #6 : 13-12-2003 14:33 » 

:arrow: ANSI Char - представляет собой так наызваемые Ansi-символы. Эти символы, которые используются в операционных системах семейства Windows. Каждому символу соответствует число либо иначе говоря код ANSI , что расшифровывается как American National Standard Institute - американский национальный институт стандартизации, в котором разработан этот код.

Всего в таблице 256 символов, которые кодируются числами от 0 до 255.
Перые символы ASCII и ANSI с кодами 0-127 совпадают, а другие символы различны.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 13-12-2003 14:50 » 

Ни когда не слышал о ASCII с кодами 128-255...

Не проще ли отдать все на растерзание библиотечным ф-иям? Не знаю, как это в win, а в *nix используется библиотека iconv (входит в glibc).
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sashok
Молодой специалист

us
Offline Offline
Пол: Мужской

« Ответ #8 : 13-12-2003 16:58 » 

Цитата: RXL
Ни когда не слышал о ASCII с кодами 128-255...
Ну как же, она называется "Extended ASCII". Там еще всякие умляуты, энье, и прочие добавочные буквы латинского алфавита прописаны.
Записан

Если бы окружающие нас объекты содержали столько же ошибок, сколько программы, цивилизация обрушилась бы от первого порыва ветра...
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #9 : 15-12-2003 11:04 » 

Ага, точно, по умолчанию там-же псевдографика была. А ещё под ДОСом можно было с codepage устанавливать. Если не соврать русская была 866.

Mfcer__, Перевод из ASCII в ANSI и наоборот сводится к табличке соответствия, которая зависит от конкретных условий. Тк ANSI тоже загружаемая.
Например немецкая отличается от русской (ессно речь идёт о символах от 0x80 до 0xFF).

Работать с такой табличкой можно так:

Код:


pszCodePage - буфер с табличкой
pszSrc - исходный массив символов

for)int i=0; i<strlen)pszSrc:; i++: pszSrc[i( = )byte:)pszCodePage[)byte:pszSrc[i((:;



зы. Вот ещё забыл - посмотри функции CharToOem и OemToChar.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Mfcer__
Команда клуба

ru
Offline Offline

« Ответ #10 : 16-12-2003 13:17 » 

Цитата

зы. Вот ещё забыл - посмотри функции CharToOem и OemToChar

Как я понял это функции колторые находятся в user32.dll. А есть ли такие функции, которые предусмотрены в си.
И можно еще поподробней рассказать о "codepage"
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #11 : 17-12-2003 12:10 » 

Цитата: Mfcer__
Как я понял это функции колторые находятся в user32.dll. А есть ли такие функции, которые предусмотрены в си.


Да это API-шные функции.
Хм... не думаю, чтоб стандарт такое поддерживал. С языком это напрямую не связано. Char-у например вообще до символов дела нет, он их как целые знаковые числа видит.

Цитата: Mfcer__
И можно еще поподробней рассказать о "codepage"


Ну представь себе табличку, вернее массив целых незнаковых чисел:

unsigned char ucCodePage[256];

первые элементы от 0 до 127 совпадают с порядковым номер, ты и сам это знаешь ASCII и ANSI - совпадают. А вот потом начинается "подгружаемая" часть. Которая под ДОС зависила например от драйверов клавы. А под виндой от выбранного языка, или кодировки.

Твоя задача сопоставить коды символов одной кодировки с кодами другой. Начиная со 128го. Например, ты хочешь, чтоб при вводе символа с кодом 192 на печать (на экран) отправился бы символ с кодом 121. Тогда:

ucCodePage[192] = 121;

и тд.

Отображение же символов зависит целиком и полностью от выбранного шрифта. Или например как принтер воспримет этот код.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #12 : 02-12-2006 13:08 » 

в FAQ (в связи участившимся в последнее время вопросами по теме) ИМХО должна быть ещё пара тем про это, но я их не нашёл (сильно не искал)
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #13 : 16-01-2007 17:03 » 

Люди,

вопрос из той же серии - просьба ногами не бить Ага:

есть старый си-шный проект, соответственно все строки представлены как char.
Теперь это все надо сделать unicode-восприимчивым (кроме немецкого и прочих стандартных текстов они хотят обрабатывать и другие, напр. русский).
Вопрос - как бы это провести наиболее безболезненно и с мин. временными и прочими затратами? (ибо как всегда сроки поджимают, клиенты кусают за выступающие части тела...)
Т.е. я пока понимаю только один путь: все char заменить на wchar_t, все функции для обработки char типа strcpy заменить соответствующими аналогами для unicode (в данном примере - wcscpy).
Возможно есть и другие, но я их не знаю... Может, кто-то уже такой кульбит на ушах выполнял? Заранее спасибо за терпение!
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #14 : 16-01-2007 23:35 » 

- char заменить на TCHAR (и вообще лучше им всегда пользоваться, кто его знает?)
- все константные строки взять в макрос: "Hallo"  -> _T("Hallo")
- использовать ф-ции не w*, а _t: strcpy -> _tcscpy - все ф-ции указаны в MSDN
- использовать CString где только возможно - он прекрасно управляется с юникодом и без него
- размер (при побайтной работе, например обнуление, или запись в файл) обязательно! умножать на размер типа

char *p = new char[nLen];
memset(p,0,nLen);
...
TCHAR *p = new TCHAR[nLen];
memset(p,0,nLen*sizeof(TCHAR));

Если следовать этим правилам ВСЕГДА, то переход на юникод займёт одну минуту - установка параметров проекта.

При этом следует заметить, что юникодная компиляция работает только на NT-платформах. Для поддержки всех вин-систем необходимо использовать MSLU (см. MSDN) - это конечно в том случае, если жизнь лёгкой кажется и тоскуешь по геморрою. Ага

зы Другого пути нет.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #15 : 17-01-2007 09:02 » 

Джон,

во-первых, CString использовать не могу - проект должен быть си-шным и с майкрософтом никак не связанным...
Далее - насколько я понимаю, TCHAR является майкрософтовским типом (а у меня все это должно летать и под линуксом), посему я и сказала о wchar_t и функциях с w***. Если я неправа, поправь меня, пожалуйста.
Насчет компиляции - по твоему описанию похоже на трагедию в моем исполнении... Компилировать надо с помощью makefile-а, который надо будет, судя по всему, как-то изменить для уникода (только мне пока не совсем ясно как). Так что геморроя мне не избежать ;-( Насчет  MSLU я сейчас поищу, что это такое.

кстати, попыталась тебе вчера вечером с работы позвонить (пока ты в поезде ехал), но твой телефон послал меня на фиг Ага Не любит он меня ,-)
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #16 : 17-01-2007 09:35 » 

Ну дык "Предупреждать надо" (с)  Короче всё, сливай воду, туши свет. Мои советы были для студии - так можно и юникод и ANSI компилировать. По сути за _T() _tc и тд скрывается опрос типа

#ifdef _UNICODE
    void FunctionW()
#else
    void FunctionA()
#endif

Вот и всё. MSLU - мелкософтовская прослойка для юникода. Требует установки доп. библиотек и компиляции всего и вся (runtime, MFC и тд и тп) с этой прослойкой.
В общем тебе тоже не поможет.

Тут лучше спроси у юниксоидов, может под никсом чего бывает.

зы А тебе позавчера звонил... Жаль А мой хэнди дурит. Мы ж во время переезда без телефона сидели (и без интернета!) - пользовались только хэндиками. Потом получилось так, что я поменялся с женой аку, а она его постоянно в экстриме гоняет и заряжает каждые 5 минут. Короче он у меня вырубается когда хочет. А мой отдавать она не хочет.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #17 : 17-01-2007 10:29 » 

Эгеж, то-то я и смотрю, что вся инфа про MSLU явно не про меня Ага
Ща буду дальше искать... Тем более у меня еще с другой стороны виселица стоит - это все должно работать с SAP-программой, т.е. я еще должна выяснить, что мне надо для того, чтобы они жили вместе и дальше (как до сих пор и было - без уникода, тихо, полюбовно Ага )

Судя по всему, мне надо в makefile-е вводить опцию UNICODE... Короче, я ищу дальше Ага

Ну я ж не знала, что вы переехали! Я увидела, что ты звонил, но было уже слишком поздно - в 10 вечера я не рискнула звонить,чтобы никого не беспокоить.
А у меня с телефоном вечная проблема - я на работе ставлю его на вибрацию, а потом после работы забываю переставлять на звонок, в результате не слышу, когда мне вечером кто-то звонит на сотовый -) Родители меня скоро за это убьют Ага
А с акку - так я вечно ловлю его, когда он уже умер или почти не дышит Ага Ну что поделаешь, женщина и техника - это ж классика Ага Хотя бывают исключения, но ооочень редко Ага
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #18 : 17-01-2007 11:18 » 

обычно так делаем.
#ifdef UNICODE
typedef std::wstring tstring;
#define _T(s) L##s
#else
typedef std::string tstring;
#define T(s)
#endif

далее почти не где не используется Cи функции ибо зло Улыбаюсь
костантные строки обёрнуты в T("ddd");
вместо std::string везде tstring
для конвертации кодировок, обычно UTF8(char)<-->UTF32(wchar_t)// вообще размер wchat_t в gcc задаётся
используем ibm icu

ну и далее как было предложено Джоном с поправками на изоляцию от MS
рекомендую сделать маленький проектик в котором опробуется работа этих макросов и typedef'ов
« Последнее редактирование: 15-12-2007 20:12 от Алексей1153++ » Записан

Странно всё это....
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #19 : 17-01-2007 12:11 » 

LogRus,

мда, а жизнь-то не налаживается ;-(

1) Почему "далее почти не где не используется Cи функции ибо зло"? А как же проводить операции со строками?
2) как  использовать UTF8(char)<-->UTF32(wchar_t) и для чего?
3) почему нельзя просто ввести wchar_t?
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #20 : 17-01-2007 12:54 » 

1. Это объекты стандартной библиотеки те должны работать на всех платформах.

2. Использовать тебе это придётся для коммуникации с НЕюникодными приложениями, например,  если "твоя" SAP - ANSI, то тогда все строчки из юникодной будут обрываться на первом же нуле, наприпер 'A' - 0x0041. Поэтому тебе надо будет конвертить.

3. Ну в принципе можно, и вот когда спустя многие тяжёлые месяцы ты, облегчённо вздохнув, созерцаешь результаты титанической работы, приходит некто и говорит, что ему нужна точно такая же программа, только с перламутровыми пуговицами - в НЕ юникоде, тк он её под Win9x запустить хочет, тут ты меееедленно выпадаешь в осадок и начинаешь себе говорить: "А ведь говорил мне LogRus, по-хорошему, по-доброму, так говорил - используй дефайны." Улыбаюсь

Offtopic:
Всё-таки умно поступил Nixdorf, что от Siemens отколупнулся. Они уже почти полностью на Win2000 перешли. Красссота! А ведь каких-нибудь пару лет назад было тяжело с поддержкой всяких 9х, NT3.5, NT4.0 А так, глядишь, лет через 10, и на ХР перейдут
Поставлю в угол.
« Последнее редактирование: 15-12-2007 20:12 от Алексей1153++ » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #21 : 17-01-2007 13:26 » 

Цитата: Джон
1. Это объекты стандартной библиотеки те должны работать на всех платформах.
Но вроде говорили о старом C-шном проекте, а объекты имеются лишь в C++.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #22 : 17-01-2007 13:48 » 

Джон,

1) я согласна с Димой - насколько я знаю, все это существует только для C++, а у меня чистый си... Или я ошибаюсь?
2) я никак не найду пример применения этих функций (в мсдн-не не нашла вообще...)
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #23 : 17-01-2007 14:02 » 

LogRus,

мда, а жизнь-то не налаживается ;-(

1) Почему "далее почти не где не используется Cи функции ибо зло"? А как же проводить операции со строками?
2) как  использовать UTF8(char)<-->UTF32(wchar_t) и для чего?
3) почему нельзя просто ввести wchar_t?

1) ну это если у тебя C++ то std::string всё умеет
2) у нас оракловый клиент а оракл имеет привычку возращать исключения в UTF8
3) потомучто если что можно выключить поддержку юникода за пару секунд.

что касается примеров использования функция то я обчно использую google codesearce Улыбаюсь прекрасный ресурс
Записан

Странно всё это....
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #24 : 17-01-2007 15:49 » 

Ну вы буквоеды. Ага А что мешает сделать это для С?

#ifdef UNICODE
    typedef wchar_t TCHAR;
#else
   typedef char TCHAR;
#endif

Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #25 : 17-01-2007 17:38 » 

Джон, ну вот, например, отсутствие класса std::string, о котором LogRus говорит. Улыбаюсь Ведь мало типы переменных поменять - ещё C-шные стандартные функции есть типа strcpy.

P.S. Те ещё буквоеды Отлично
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #26 : 17-01-2007 17:41 » 

Согласная я! Ага
Просто когда на чем-то сосредоточен, а тут еще начальство за спиной притаилось с коварным вопросом типа :"НУ так как оно?", извилины перестают работать с выдумкой и начинают работать тупо и прямо Ага

Я уже загрузила ICU-библиотеку, посмотрю, зачем она нам Ага
А с этими смешными функциями завтра разбираться буду Ага
Тут для начала надо выяснить элементарные вещи типа будет ли скелет проги стартовать и соединятъся с сапом, а если да, то еще и выяснить, получу ли я данные от них и смогу ли им что-то отправить. Короче, бред сивой кобылы в 3 часа ночи Ага
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #27 : 18-01-2007 02:48 » 

Джон, ну вот, например, отсутствие класса std::string, о котором LogRus говорит. Улыбаюсь Ведь мало типы переменных поменять - ещё C-шные стандартные функции есть типа strcpy.

Насчёт STL согласен, без объектов ваще тяжко.

[не в тему]Хотя с другой стороны - кто мешает перейти на С++?[/не в тему]

 Я про пример определения ф-ций:

char *strcpy( char *strDestination, const char *strSource );
wchar_t *wcscpy( wchar_t *strDestination, const wchar_t *strSource );

Их тоже можно определить через макрос управляемый ключом UNICODE. Я вот только не знаю, может по никсом уже есть нечто подобное? Наверняка. Так их сразу и использовать.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #28 : 18-01-2007 14:03 » 

Функции операции со строками можно переопределить при помощи макросов переносимым образом.  Проблемы с переносимостью возникнут при вводе/выводе.

Именно, в Windows начиная с VS 2005 у потока ввода-вывода есть параметр, определяющий размер символов: ANSI (8 бит) и Unicode (UTF-16 или UTF-8).  Соответственно, результат вывода в поток функцией fwprintf на винде зависит от режима потока - при печати в ANSI поток широкие символы будут трактоваться как UTF-16 и конвертироваться в текущую кодовую страницу.  Печать в поток Unicode функцией fprintf не поддерживается совсем, поэтому предсказать, что напечатает функция ftprintf на винде - не тривиальная задача.
Поддержка Unix (POSIX) версии добавит ещё сложностей:
1. в POSIX не понятно, что именно сбрасывают функции вывода в поток - то ли wide char как они есть (16 бит), то ли производят конверсию в текущую локаль. Для каждой ОС и каждой версии библиотеки LIBC необходимо проводить эксперименты, что именно они делают.
2. в POSIX (и ISO C) и Windows по-разному интерпретируется спецификатор %s в строке формата fwprintf.  В windows %s означает, что соответствующий аргумент есть строка широких символов wchar_t, а в POSIX (ISO C) %с означает, что аргумент есть строка многобайтовых символов, которые перед печатью необходимо сконвертировать вызовами mbrtowc.  Для того, чтобы получить одинаковый результат, в Windows надо писать формат %s, а в линуксе %ls.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #29 : 19-01-2007 10:07 » 

Ой мама, а оптимизму-то у меня постепенно все меньше и меньше... Ага
С fprintf, судя по всему, мне еще предстоит развлечься, но это потом Ага

Пока более идиотский вопрос:

Сначала инфа к пониманию:
1)я наконец-то нашла инфу о том, в каком виде ожидаются данные на стороне SAP-а при использовании unicode: wchar_t или unsigned short.
2) программа стартует из окна cmd.exe с и имеет набор параметров для запуска:
saprfcsr.exe  -a DLG_TEST -g sap1 -x sapgw00

Сама проблема:
есть стандартная функция main(int argc, char** argv1).
В argv1 после старта лежат все данные, описанные в п.2). И этот список параметров должен быть послан дальше к RFC-проге с помощью функции RfcAccept(), которая проверит их на вшивость и при положительном решении разрешает соединение. В соответствующей RFC-функции этот параметр ожидаетя при unicode-запуске соответственно как wchar_t.
Если параметр argv1 сделать как wchar_t сразу в main(), то данные нечитабельны уже на входе в мою прогу. Значит, надо оставить argv1 как char**, а затем преобразовать данные в wchar_t.
Делаю:

Код:
    //  SAP_UC - typedef, определяющий тип wchar_t/char в зависимости от
    // #ifdef UNICODE (поставляется с unicode-вариантом RFC-проги)
    // функции с окончанием ..U также определены в этой поставке для возможности
    //переключения из одного состояния в другое:
/*
#define sizeofR(par)         sizeof(par)

#ifndef SAPwithUNICODE
  #define sizeofU(par)       sizeof(par)
#else
  #define sizeofU(par)       (sizeofR(par)/sizeofR(SAP_UC))
#endif

#define memsetU(  s,  wc, len )  wmemset(  s,  wc, len )
typedef size_t          size_tU;
*/
    int count;
    SAP_UC **argv = NULL;

    argv = (SAP_UC**)mallocU(argc * sizeofU(SAP_UC*));
    argv = (SAP_UC**)mallocU(argc * sizeofU(SAP_UC*));
    if (argv)
    {
        memset( argv, 0, argc * sizeofU(SAP_UC*) );
        for (count=0;count<argc;count++)
        {
            argv[count] = (SAP_UC*)mallocU(CHAR_COUNT * sizeofU(SAP_UC));

            if (argv[count])
            {
                memsetU( argv[count], 0, CHAR_COUNT * sizeofU(SAP_UC) );

                mbstowcs (argv[count], argv1[count], (size_tU)CHAR_COUNT);
            }
        }
    }

В результате я ожидаю argv - здоровую копию нашего argv1, но в виде wchar_t! Фигушки!!! При вызове RfcAccept() прога корчится от боли из-за проблем с доступом к памяти...
Вопрос: что я сделала неверно??? Что не так преобразовано?...
Я также попробовала поубирать все эти "U" и использовать обычные функции, но это не спасло тоже
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #30 : 19-01-2007 10:44 » 

Тебе не нужно пользоваться sizeofU, а надо пользоваться обычным sizeof.   sizeofU(SAP_UC *) в случае юникода даст тебе sizeofR(SAP_UC *)/sizeofR(SAP_UC), что далее разворачивается в sizeof(SAP_UC*)/sizeof(SAP_UC) == sizeof(SAP_UC*)/2.  То есть если argc==2, то будет выделена память не под два указателя, а только под один.  Первый указатель внешняя функция успешно скушает, а на втором подавится.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #31 : 19-01-2007 11:28 » 

npak,

не совсем поняла, почему это так Ага, но попробовала Ага не помогло...
Хотя перед вызовом функции весь массив argv выглядит до неприличия здоровым! Т.е. все элементы правильно заполнены, память никуда не сдвинулась...
И что им не так, не знаю...
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #32 : 19-01-2007 13:29 » 

Предлагаю внести несколько изменений.  Во-первых, при инциализации массивов пользоваться функцией calloc - так проще сразу по двум причинам: (1) явно указывается размер элементов и (2) автоматически обнуляется память.
Во-вторых, обеспечить ноль в конце каждой строки: mbstowcs не обязана строить строки с нулевым окончанием.
В-третьих, сделай argv на 1 больше и поставь в качестве последней строки NULL - стандарт POSIX требует, чтобы argv заканчивался такой строкой.

я попробовал твой пример (с такими изменениями) на Linux, и получилось вот что:
Код:
#include <wchar.h>
#include <stdlib.h>

//  SAP_UC - typedef,   wchar_t/char
    // #ifdef UNICODE (  unicode- RFC-)
    //    ..U
    //     :
typedef wchar_t SAP_UC;
#define CHAR_COUNT 25

int  main(int argc, char ** argv1)
{
    SAP_UC **argv = NULL;
    size_t argv_len = argc+1;
    size_t str_len = CHAR_COUNT + 1;

    argv = calloc(argv_len, sizeof(SAP_UC*));
    if (argv)
    {
        int count;
        for (count=0;count<argc;count++)
        {
            argv[count] = calloc(str_len, sizeof(SAP_UC));

            if (argv[count])
            {
                int res;
                memset( argv[count], 0, CHAR_COUNT * sizeof(SAP_UC) );

                printf("converting argv[%d] (%s) ...", count, argv1[count]);
                res = mbstowcs(argv[count], argv1[count], CHAR_COUNT);
                printf(" result %d\n", res);
            }
        }
        argv[argc] = NULL;
        for (count=0;count<argc;count++)
        {
            int pos;
            printf("argv[%d]: ", count);
            for (pos = 0; pos < str_len; pos ++)
            {
                printf("0x%04x ", argv[count][pos]);
            }
            printf("\n");
        }
    }
    return 0;
}
и вывод:
Код:
./some.exe -a DLG_TEST -g sap1 -x sapgw00
converting argv[0] (./some.exe) ... result 10
converting argv[1] (-a) ... result 2
converting argv[2] (DLG_TEST) ... result 8
converting argv[3] (-g) ... result 2
converting argv[4] (sap1) ... result 4
converting argv[5] (-x) ... result 2
converting argv[6] (sapgw00) ... result 7
argv[0]: 0x002e 0x002f 0x0073 0x006f 0x006d 0x0065 0x002e 0x0065 0x0078 0x0065 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
argv[1]: 0x002d 0x0061 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
argv[2]: 0x0044 0x004c 0x0047 0x005f 0x0054 0x0045 0x0053 0x0054 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
argv[3]: 0x002d 0x0067 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
argv[4]: 0x0073 0x0061 0x0070 0x0031 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
argv[5]: 0x002d 0x0078 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
argv[6]: 0x0073 0x0061 0x0070 0x0067 0x0077 0x0030 0x0030 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #33 : 19-01-2007 13:45 » 

npak,

спасибочки!!!!  Улыбаюсь Проблема была именно в последнем элементе массива, т.к. он не был обнулен! Я как-то вообще в этом направлении не думала, я искала ошибки в обнулениях, копированиях и т.д., а о том, что сам массив незакончен, вообще не подумала.  Скромно так...

Еще раз спасибо всем за помощь и терпение!
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #34 : 19-01-2007 15:01 » 

Рад был помочь Улыбаюсь
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Страниц: 1 2 [Все]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines