| 1 2 3 |
| Стандарт перевода wchar_t в char | |
| От: | Аноним 998 | ||
| Дата: | 09.02.10 06:33 |
| Подскажите, гуру, что на данный момент является стандартом С++ преобразования из wchar_t в char? Нарыл вагон примеров. Все работает, но мне надо для тестового задания точно знать, как ПРАВИЛЬНО и переносимо сделать преобразование. Например, вывести в поток ofstream строку wchar_t (не двоичным образом, а предврительным преобразованием в char). Заранее спасибо. |
| Re: Стандарт перевода wchar_t в char | |
| От: | K13 | ||
| Дата: | 09.02.10 07:03 | ||
| Оценка: | 3 (2) +1 | ||
| думаю, лучше всего взять libiconv |
| Re: Стандарт перевода wchar_t в char | |
| От: | A_P | ||
| Дата: | 09.02.10 12:06 | ||
| Оценка: | 1 (1) +1 | ||
| Какая OS, какой компилятор? Какие библиотеки, сказали использовать? Win API функции: MultiByteToWideChar WideCharToMultiByte Большинство функций, макросов, классов — это обертки вокруг этих двух функций, если вы под Windows |
| Re: Стандарт перевода wchar_t в char | |
| От: | gear nuke | ||
| Дата: | 09.02.10 19:49 | ||
| Оценка: | 6 (2) | ||
| Здравствуйте, <Аноним>, Вы писали: А>что на данный момент является стандартом С++ преобразования из wchar_t в char? Пока только что только proposed wstring_convert А>Например, вывести в поток ofstream строку wchar_t (не двоичным образом, а предврительным преобразованием в char). Используя C, что входит в стандартную библиотеку C++:
. People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth |
| Re[2]: Стандарт перевода wchar_t в char | |
| От: | gear nuke | ||
| Дата: | 09.02.10 19:52 |
| Здравствуйте, A_P, Вы писали: A_P>Какая OS, какой компилятор? A_P>Какие библиотеки, сказали использовать? Написано же всё:
. People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth |
| Re[2]: Стандарт перевода wchar_t в char | |
| От: | puredev | ||
| Дата: | 10.02.10 08:20 |
| Здравствуйте, gear nuke, Вы писали: GN>Здравствуйте, <Аноним>, Вы писали: А>>что на данный момент является стандартом С++ преобразования из wchar_t в char? GN>Пока только что только proposed wstring_convert А>>Например, вывести в поток ofstream строку wchar_t (не двоичным образом, а предврительным преобразованием в char). GN>Используя C, что входит в стандартную библиотеку C++: GN>
Спасибо за пример! Единственно, мне надо было в файл (ofstream): std::ofstream Logger::_file("task.log", std::ios::out|std::ios::trunc); ... void Logger::trace(std::wstring& text) throw() { _file << " ## " << std::endl; setlocale(LC_ALL, "russian"); std::ostream_iterator<char> osi( _file ); transform( text.begin(), text.end(), osi, wctob ); } надеюсь прокатит |
| Re[2]: Стандарт перевода wchar_t в char | |
| От: | alsemm | ||
| Дата: | 10.02.10 08:40 |
| Здравствуйте, gear nuke, Вы писали: GN>Используя C, что входит в стандартную библиотеку C++: GN>
И в какой кодировке будет вывод в osi? win1251? koi8r? или utf8? |
| Re[3]: Стандарт перевода wchar_t в char | |
| От: | gear nuke | ||
| Дата: | 10.02.10 14:38 |
| Здравствуйте, alsemm, Вы писали: A>И в какой кодировке будет вывод в osi? win1251? koi8r? или utf8? Я не понял вопрос. Если выводить в файловый стрим, то ostream_iterator будет использовать
Коневерсия выполняется (как просили "предврительным преобразованием в char") функуией wctob в соответствии с кодовой страницей выбраной для текущей локали
Поскольку в моём примере osi выводит на консоль, то она будет отображать используя локаль пользователя по умолчанию. Или намекалось, что следует для конверсии использовать фасеты? Тогда на вопрос "как ПРАВИЛЬНО?" я скажу что надо читать документацию, что бы не напутать. . People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth |
| Re[4]: Стандарт перевода wchar_t в char | |
| От: | Mr.Cat | ||
| Дата: | 10.02.10 14:44 | ||
| Оценка: | +1 | ||
| Здравствуйте, gear nuke, Вы писали: GN>Коневерсия выполняется (как просили "предврительным преобразованием в char") функуией wctob в соответствии с кодовой страницей выбраной для текущей локали А если локаль — utf8? |
| Re[4]: Стандарт перевода wchar_t в char | |
| От: | alsemm | ||
| Дата: | 10.02.10 19:01 |
| Здравствуйте, gear nuke, Вы писали: GN>Или намекалось, что следует для конверсии использовать фасеты? Нет, не намекалось. Просто в исходном примере
было не понятно, как указывается кодировка. В любом случае, толку от wctob никакого, если в локали выбрана кодировка utf8, как заметил Mr.Cat |
| Re[5]: Стандарт перевода wchar_t в char | |
| От: | gear nuke | ||
| Дата: | 10.02.10 22:07 |
| Здравствуйте, Mr.Cat, Вы писали: MC>А если локаль — utf8? Значит настало будущее, 0x год Локаль несклько шире, чем кодовая страница, это набор фасетов. Кодовые страницы относятся к фасетам категории ctype. Текущий стандарт определяет 2 фасета, из которых конверсию выполняет только один — codecvt<wchar_t,char,mbstate_t>. Кодировки, для которых выполняется конверсия, зависят от реализации. В частности MSVC не поддерживает кодовые страницы utf-7 & utf-8. Ровно как и wctob не будет конвертировать в более чем однобайтное представление. Если пройти по ссылке (из первого ответа) на proposal, то можно увидеть: то есть предполагается, что его надо где-то взять (с инструкциями к использованию). Так же по той ссылке сказано: что намекает, что конверсия может выполняеться непосредственно при выводе в файл (но, как я понял вопрос, это не интересовало). И, кстати, в исходном вопросе ничего про кодировки не сказано, о чём я намекал закомментированной строкой . People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth |
| Re: Стандарт перевода wchar_t в char | |
| От: | fk0 | ||
| Дата: | 10.02.10 22:26 |
| Здравствуйте, Аноним, Вы писали: А>Подскажите, гуру, что на данный момент является стандартом С++ преобразования из wchar_t в char? Про C++ не скажу. Там может что-то поверх C-шных интерфейсов быть. Не знаю. Если вообще, то примерно это: http://www.unix.org/version2/whatsnew/mse.html А>Нарыл вагон примеров. Все работает, но мне надо для тестового задания точно знать, как ПРАВИЛЬНО и переносимо сделать преобразование. Вы таки определитесь, вам по стандарту (ISO, ГОСТ, IEEE, etc...) или под windows. А>Например, вывести в поток ofstream строку wchar_t (не двоичным образом, а предврительным преобразованием в char). mbstowcs(wchar_t*,...) |
| Re[2]: Стандарт перевода wchar_t в char | |
| От: | fk0 | ||
| Дата: | 10.02.10 22:33 |
| Здравствуйте, K13, Вы писали: K13>думаю, лучше всего взять libiconv Если он не интегрирован в libc штатно -- оно не более чем жалкая поделка финских студентов. |
| Re[3]: Стандарт перевода wchar_t в char | |
| От: | fk0 | ||
| Дата: | 10.02.10 22:35 |
| Здравствуйте, alsemm, Вы писали: A>И в какой кодировке будет вывод в osi? win1251? koi8r? или utf8? В зависимой от локали. В теории... |
| Re[3]: Стандарт перевода wchar_t в char | |
| От: | fk0 | ||
| Дата: | 10.02.10 22:37 |
| Здравствуйте, puredev, Вы писали: А>>>что на данный момент является стандартом С++ преобразования из wchar_t в char? GN>> ostream_iterator<char> osi(cout); GN>> transform(ws.begin(), ws.end(), osi, wctob); DESCRIPTION The wctob() function tests whether the multi-byte representation of the wide character c, starting in the initial state, consists of a single byte. If so, it is returned as an unsigned char. Never use this function. It cannot help you in writing international- ized programs. Internationalized programs must never distinguish sin- gle-byte and multi-byte characters. Читайте маны, они рулез (C) P>надеюсь прокатит Нипракатило. mbstowcs таки прокатит. Но я бы потестировал везде, вроде как нигде кроме линуха оно толком не работает вроде как. |
| Re[3]: Стандарт перевода wchar_t в char | |
| От: | gear nuke | ||
| Дата: | 10.02.10 22:41 |
| Здравствуйте, puredev, Вы писали: P>Спасибо за пример! P>Единственно, мне надо было в файл (ofstream): А я может быть и не понял вопрос Такой вариант известен?
. People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth |
| Re[2]: Стандарт перевода wchar_t в char | |
| От: | fk0 | ||
| Дата: | 10.02.10 22:55 |
| Здравствуйте, gear nuke, Вы писали: А>>что на данный момент является стандартом С++ преобразования из wchar_t в char? GN>Используя C, что входит в стандартную библиотеку C++: GN>
Говнокод.
В последней строке сущность говнокода проявлена. С другой стороны, повторюсь, мне проверить сейчас негде, но я чуть менее чем уверен, что на разных вариантах BSD и Solaris будет хрен в 8-битных локалях. Возможно. В линуксе всё чотка. Что будет в виндах не знаю, но скорей вообще работать не будет, только если в cygwin, поэтому если говорить о переносимости, то скорей либо писать свои обёртки под разные платформы, либо пытаться реализовать для отдельных ущербных платформ собственные функции поддержки конверсии wchar_t как должно быть по стандарту. |
| Re[4]: Стандарт перевода wchar_t в char | |
| От: | gear nuke | ||
| Дата: | 10.02.10 22:59 |
| Здравствуйте, fk0, Вы писали: fk0>DESCRIPTION fk0> The wctob() function tests whether the multi-byte representation of the fk0> wide character c, starting in the initial state, consists of a single fk0> byte. If so, it is returned as an unsigned char. fk0> Never use this function. It cannot help you in writing international- fk0> ized programs. Internationalized programs must never distinguish sin- fk0> gle-byte and multi-byte characters. fk0> Читайте маны, они рулез (C) rule — значит правило, стандарт. А маны привирают про возвращаемое значение. Нужна ли конверсия из wchar_t в char в "internationalized programs", или где-то ещё — с какой стати маны решают за пользователя, это так называемая свобода?
fk0>mbstowcs таки прокатит. Но я бы потестировал везде, вроде как нигде кроме линуха fk0>оно толком не работает вроде как. mbstowcs определена в стандарте С, при чём тут линух . People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth |
| Re[5]: Стандарт перевода wchar_t в char | |
| От: | fk0 | ||
| Дата: | 10.02.10 23:05 |
| Здравствуйте, gear nuke, Вы писали: fk0>>DESCRIPTION fk0>> The wctob() function tests whether the multi-byte representation of the fk0>> wide character c, starting in the initial state, consists of a single fk0>> byte. If so, it is returned as an unsigned char. fk0>> Never use this function. It cannot help you in writing international- fk0>> ized programs. Internationalized programs must never distinguish sin- fk0>> gle-byte and multi-byte characters. fk0>> Читайте маны, они рулез (C) GN>rule — значит правило, стандарт. А маны привирают про возвращаемое значение. Нужна ли конверсия из wchar_t в char в "internationalized programs", или где-то ещё — с какой стати маны решают за пользователя, это так называемая свобода? Свобода -- это рабство. (C) Маны какбе подсказывают и уберегают от говнокода. Жителям свободной страны конечно наплевать на internationalized characters, но неизвестно кто будет пользоваться их (говно)софтом. fk0>>mbstowcs таки прокатит. Но я бы потестировал везде, вроде как нигде кроме линуха fk0>>оно толком не работает вроде как. GN>mbstowcs определена в стандарте С, при чём тут линух Вообще я имел ввиду wcstombs. Линух при том, что только в егойной гнутой libc более-менее это всё работает. Мне и самому интересно знать где и как не работает. У freebsd или openbsd своя libc, у солярисов своя, у микрософта вообще чёрт ногу сломит. А "стандарту" не так уж много лет. И даже в линухе это может не работать в некоторых случаях (например, при несгенерированной локали, как я понимаю, фиг что будет). |
| Re[6]: Стандарт перевода wchar_t в char | |
| От: | Mr.Cat | ||
| Дата: | 10.02.10 23:09 | ||
| Оценка: | +1 | ||
| Здравствуйте, gear nuke, Вы писали: GN>Ровно как и wctob не будет конвертировать в более чем однобайтное представление. Ну я на это и намекал. Кстати, мне почему-то кажется, что с iconv будет проще, чем со всякими ортодоксатьными сиплюсплюсными потоками-шаблонами. Например, когда я последний раз интересовался, в бусте (в частности, xpressive) не было поддержки utf8 — и, мне кажется, это неспроста. |
| 1 2 3 |