![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
shaukote |
|
||||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 13.2.2013 Репутация: нет Всего: нет |
Всем доброго времени суток.
Буду очень благодарен, если кто-нибудь здесь сможет мне помочь. Сначала кратко опишу ситуацию. Являясь студентом технического вуза, я постоянно пишу на C++ различные программы различной степени сложности, в основном - консольные. При этом я склонен работать с Unicode (wchar_t, L" ... ", std::wstring, std::wcin, std::wcout etc) и храню исходники в UTF-8, благо Sublime делает это по умолчанию. Чаще всего я работаю под Windows 7, соответственно компилирую свои поделия MinGW и запускаю их в cmd.exe. Однако иногда у меня возникает потребность сделать это в Linux, соответственно, с gcc и местной консолью. Соответственно, мне нужно как-то обеспечивать корректный ввод/вывод Unicode в своих программах. При чём желательно сделать это стандартными кроссплатформенными средствами. Теперь как я решал эту ситуацию. До этого момента я просто помещал в начало программы вызов
Однако с недавнего момента перестало. На протяжении последних дней я безуспешно пытался выяснить, в чем проблема, и в это время ввод/вывод то не работал, при этом ломаясь в самых странных местах. Прозвучит, глупо, возможно, но возникло ощущение, что оно зависит "от фазы Луны". Так что, судя по всему, этот метод не работает. Я решил посоветоваться со Страуструпом - он в своей книге рекомендует использовать класс std::locale. Что же, пробуем:
Во время выполнения получаем runtime_error, что говорит о том, что такой локали нету. :( Скажите пожалуйста, как корректно обеспечить ввод/вывод Unicode? |
||||
|
|||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
В бусте есть затычка для ввода вывода юникода http://www.boost.org/doc/libs/1_33_1/libs/...oc/codecvt.html
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
shaukote |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 13.2.2013 Репутация: нет Всего: нет |
Но ведь и в STD есть (вроде бы как) средства для этого - те же wcin/wcout. Неужели нельзя обойтись без сторонних библиотек?
|
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
wcin/wcout сами не умеют работать с кодировками. Они знают что такое 2х байтовый символ, но по умолчанию интерпретировать его будут через фасет codecvt . Как я понял, фасеты определяют преобразование из внутренней кодировки, которую использует программа во внешнюю которую используют потоки ввода/вывода. Вижу в С++11 ввели уже utf16 фасеты. Можно посмотреть тут.
http://www.cplusplus.com/reference/codecvt/codecvt_utf16/ И еще проблема строчки locale russian("ru_RU.UTF-8"); состоит в том, что на нужной платформе может не оказаться фасета с таким именем в каталоге. Этот идентификатор "ru_RU.UTF-8" линуксового происхождения. Это сообщение отредактировал(а) Alexeis - 6.4.2013, 16:09 -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
shaukote |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 13.2.2013 Репутация: нет Всего: нет |
Эмм.
А можно полюбопытствовать, как люди управляли кодировками ввода/вывода до появления C++11? Нежели исключительно платформозависимыми средствами?.. Просто задача-то вроде вполне стандартная, как-то же все это делают?.. |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
shaukote, в свое время я сам задавался этим вопросом. Гугл в основном выдает код типа
Или же 2й вариант для винды. Часто встречаются самописные варианты фасетов. Возможно стараются работать с файлами во внутренней кодировке или средствами языка С. Довольно неплохое описание нашел тут http://habrahabr.ru/post/107679/ Но автор использует самописные фасеты и рекомендует их для переносимости кода. Добавлено через 1 минуту и 10 секунд поскольку буст уже стал почти стандартом, я бы рекомендовал использовать бустовкие фасеты вместо самописных. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
volatile |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
имхо, да. не уверен даже, что в C++11 сделали наконец это на 100%, (не изучал пока этот вопрос) но до этого, ничем платформонезависимым в юникодных кодировках и не пахло. shaukote,
а что вы хотите с UTF-8 под другому и не бывает. ![]() |
||||
|
|||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
По отзывам в инете работает плохо. Лично я пользую _wfopen и гружу сразу в wstring так чтобы не было никаких конвертаций. Дальше перекодирую уже строки между собой платформозависимыми способами. Но вообще стараюсь работать только с wstring UTF16 без преобразований. Соответственно если файл в той же кодировке то можно хоть бинарно грузить. По крайней мере имею только конвертацию строк. Файлы работают одинаково. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
shaukote |
|
||||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 13.2.2013 Репутация: нет Всего: нет |
Вы это серьёзно? Если да, то можете поподробнее разъяснить почему так?
Печально, конечно же. Хорошо, позвольте слегка переформулировать вопрос. Как лучше всего устанавливать кодировку в ввода/вывода в отдельных системах (Windows\Linux). Т.е., в Linux, наверное, вполне хорошим решением будет и
А как лучше всего в Windows это делать (начхав на платформонезависимость)? Добавлено через 2 минуты и 39 секунд И да, Alexeis, спасибо за ссылки. (: Это сообщение отредактировал(а) shaukote - 7.4.2013, 00:52 |
||||
|
|||||
volatile |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Здесь уже был когда-то большой срач диспут по поводу использования UTF-8. мое имхо (но есть и другие мнения), что UTF-8 не предназначена для активной работы со строками. Эта кодировка для передачи данных по сетям, может быть для хранения, но никак не для активной работы.
Я строронник этого способа. (хотя у него и есть недостатки). Но у других способов недостатков еще больше. вот почитайте отсюда |
||||
|
|||||
shaukote |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 13.2.2013 Репутация: нет Всего: нет |
Не работает с MSVC++ ни в VS, ни в Qt Creator. Английские буквы выводятся вопросительными знаками, на вводе русских вообще подвисает. :( |
|||
|
||||
shaukote |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 13.2.2013 Репутация: нет Всего: нет |
В MinGW вообще не компилируется. :(
|
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Странно сейчас проверил на С++ Builder так работает правильно пример безо всяких фасетов
Чего только не делал и TCHAR менял тип и кодировку исходника, работает как часы. Жаль нет под рукой других компиляторов. Помниться у меня проблема была именно с файлами. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
shaukote, да там консольный ввод не работает. это и есть недостаток, но его можно обойти. (лично у меня не было задач, где нужно было вводить с консоли, поэтому пока меня это устраивает.) Все остальное работает. С файловым вводом вообще проблем никогда не было. Добавлено через 2 минуты и 43 секунды более того, в винде кроме вышеназванной фичи вообще больше нет средств для вывода мультиязычного текста в консоль.) насколько я знаю. |
|||
|
||||
shaukote |
|
||||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 13.2.2013 Репутация: нет Всего: нет |
Alexeis, я в шоке, но первая половина и у меня работает. А вот на строковом потоке уже начинается бардак - на некоторых буквах он работает некорректно.
volatile, по приведённой Вами ссылке Вы пишете:
Я же точно так же сделал, почему же у меня ввод не работает?
А странно-полуработающий вариант Alexeis? ![]() Это сообщение отредактировал(а) shaukote - 8.4.2013, 01:55 |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |