Любитель чаепитий
|
||||||
1 | ||||||
Корректен ли каст из string в wstring?01.11.2016, 20:51. Показов 3835. Ответов 18
Метки нет (Все метки)
Доброго вечера.
Вот кусок кода:
string_t<> - выбирает тип строки в зависимости от шаблона char_type , аналогично std::basic_string< char_type > .reverse_char_t<> - выбирает противоположный тип символов, то есть если передать char , то заменит на wchar_t и наоборот.В общем-то хотел узнать, корректно ли так кастовать? Если будет wchar_t с какими-то символами, которые не влазят в char , то не будет ли это UB?
0
|
01.11.2016, 20:51 | |
Ответы с готовыми решениями:
18
Каст this к std::string Из string в wstring Wstring to string как конвертировать Из wchar_t* в wstring или в string |
230 / 113 / 79
Регистрация: 17.10.2016
Сообщений: 312
|
|
01.11.2016, 20:57 | 2 |
UB не будет. А вот потеря данных при преобразовании whar_t в char возможна.
Добавлено через 2 минуты http://www.cplusplus.com/refer... /wcstombs/
1
|
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,706
|
|
02.11.2016, 09:27 | 4 |
Кодировка же от такого не преобразуется.
0
|
Любитель чаепитий
|
|
02.11.2016, 10:18 [ТС] | 5 |
Я знаю, но мне этого и не нужно.
Суть в том, что я даю пользователю выбор, работать с char или wchar_t, но иногда мне надо кидать исключения с осмысленными значениями в переменных, поэтому требуется вставить содержимое этой строки в исключение, но т.к. не существует оператора + для разных типов строк, то пришлось идти на такую "хитрость".
0
|
Форумчанин
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|||||||||||
02.11.2016, 10:25 | 6 | ||||||||||
Как вариант, MultiByteToWideChar
Не зная всей задачи, можно предположить, что не надо пользователю давать доступ к такой низкоуровневой части. Наоборот, желательно инкапсулировать тип хранения данных. Пусть работает с tstring, который может быть как wstring, так и string, в зависимости от условий задачи. И функции все написать под tstring. Добавлено через 3 минуты Либо такой вариант:
0
|
Любитель чаепитий
|
|
02.11.2016, 10:41 [ТС] | 7 |
Не подойдёт, я же за кроссплатформу, а это WinAPI!
Может и не надо, я просто учился шаблонам и решил дать пользователю такую возможность. Он и инкапсулирован в string_t, всё внутри классов через них делается, пользователь волен только выбрать с какой кодировкой будет он работать с данным экземпляром класса. Это известно только пользователю, именно поэтому было решено так сделать. Или Вы что-то другое имеете ввиду? Не понимаю, чем мой вариант не подходит?
0
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|
02.11.2016, 11:02 | 9 |
1) Взять std::wstring_convert из C++11. Если, конечно, в ваш C++11 положили codecvt (бывает и не кладут).
2) Взять преобразователь utf8->wchar_t из буста. 3) Взять готовый код. 4) Разобраться в структуре utf8, накатать свой конвертер. Ну, он конечно же не в три строчки пишется, но ничего сложного.
1
|
Форумчанин
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
||||||
02.11.2016, 11:07 | 10 | |||||
Сообщение было отмечено GbaLog- как решение
Решение
А вот каст string->wstring через codecvt
Есть ещё пятый вариант - iconv.
1
|
Любитель чаепитий
|
|||||||||||
02.11.2016, 14:30 [ТС] | 11 | ||||||||||
А вот такое какие подводные камни сулит, кроме эксепшонов при ?
У Вас какие-то лишние телодвижения, как мне кажется. Хотя, скорее всего, я чего-то не понимаю просто.
0
|
Любитель чаепитий
|
|
02.11.2016, 14:42 [ТС] | 13 |
У меня в приложении, к счастью, поддерживается только латиница, отклонение от неё вызывает экзепшон.
Поэтому я, пожалуй, буду использовать свой вариант.
0
|
Форумчанин
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
||||||
02.11.2016, 15:25 | 14 | |||||
Тогда зачем вообще нужен wchar_t? Все символы из US-ASCII влезут в байт (даже в полбайта). То есть любая ASCII-совместимая кодировка будет иметь одинаковые символы. И даже при преобразовании из UTF-8.
И действительно, при таком ограничении, никаких дополнительных алгоритмов кодировки не нужно, желательно лишь проверить, что код символа не выходит за старшие 4 бита (имеет код от 0 до 127). Добавлено через 2 минуты То есть вполне валидно даже делать так:
0
|
Любитель чаепитий
|
|
02.11.2016, 15:37 [ТС] | 15 |
На самом деле я и сам думал о том, что мне не нужен этот wchar_t.
Но для обучения решил сделать и с ним. Добавлено через 47 секунд Пока останется, как есть, дальше виднее будет.
0
|
Форумчанин
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|
02.11.2016, 15:54 | 16 |
Можно, как вариант, ввести свой тип - параметр char_traits от basic_string, который позволил бы осуществлять регистронезависимое сравнение и поиск в словах. Тут хоть будет профит виден, а не привязка реализации к условию задачи.
У меня, если что, есть уже готовая реализация, но я думаю, что тебе самому будет интересно её написать. В крайнем случае, могу выложить.
0
|
Любитель чаепитий
|
||||||
02.11.2016, 16:52 [ТС] | 17 | |||||
MrGluck,
Это Вы мне типа задание дали? Ладно.
0
|
Форумчанин
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|
02.11.2016, 17:36 | 18 |
Подбросил идею как можно разнообразить строки и поработать с шаблонами, не меняя char_type.
Но раз уж код выложен.. В compare и find можно уже не приводить к tolower. И find вроде вообще не нужен.
0
|
Любитель чаепитий
|
|
02.11.2016, 17:47 [ТС] | 19 |
0
|
02.11.2016, 17:47 | |
02.11.2016, 17:47 | |
Помогаю со студенческими работами здесь
19
Перевод из string в wstring. Неправильная кодировка По поводу wchar_t, wstring, char, string и кодировок Не могу поместить в переменную wstring и string русское слово Как правильно перевести std::wstring в std::string ? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |