(Нашел этот вопрос при случайном просмотре; прошло много времени с тех пор, как я изучал C ++.) Значит, в стандартной библиотеке нет преобразования std :: string -> std :: wstring? Это кажется странным; есть ли веская причина?
Domenic
5
Если вы используете std :: vector <wchar_t> для создания хранилища для buf, тогда, если что-то вызовет исключение, ваш временный буфер будет освобожден.
Джейсон Харрисон,
81
причина # 233 относительно того, почему С ++ меня до чертиков раздражает .. 10 строк кода для простого преобразования строк = /
b1nary.atr0phy
2
Или просто скажите wstring ws (s.begin (), s.end ()) ...?
CJBrew
3
@CJBrew: Для каждой проблемы есть решение, чистое, элегантное и неправильное. Ваш основан на предположении, что ваш ввод содержит только символы ASCII ( не ANSI).
Inspectable,
123
Решение на самом деле намного проще, чем любые другие предложения:
Извини, Бенни, но это не работает для меня, собственное решение Toran, похоже, работает нормально (но ... блин!).
Иэн Коллинз
32
Это работает, только если все символы однобайтовые, то есть ASCII или ISO-8859-1 . Все, что угодно, многобайтовое, потерпит неудачу, включая UTF-8.
Марк Рэнсом
Я считаю, что вы можете упростить первую строку до: std :: wstring stemp (s.begin (), s.end ()); Это устранило бы возможную копию и выглядело бы проще; обратите внимание, что компилятор может в любом случае удалить копию, но это все еще более простой вид.
Kit10,
13
Господи, что за все апвоуты? Этот ответ иногда работает только по совпадению. Он полностью игнорирует кодировки символов . Вы не можете просто расширить узкий символ и надеяться, что он волшебным образом превратится в широкий символ, представляющий ту же кодовую точку. Это моральный эквивалент a reinterpret_cast. Этот код не работает. Не используй. .
Inspectable
2
@nik: В Windows a charобычно кодируется как ANSI. При кодировании ANSI значения от 128 до 255 интерпретируются с использованием текущей активной кодовой страницы. Помещение этих значений в wchar_t(кодировку UTF-16 в Windows) не даст желаемого результата. Если быть точным, это работает ровно в 50% случаев. С учетом кодировки символов DBCS этот процент еще больше уменьшается.
Inspectable
10
Если вы находитесь в среде ATL / MFC, вы можете использовать макрос преобразования ATL:
Затем вы можете использовать unicodeStr как LPCWSTR. Память для строки Unicode создается в стеке и освобождается, после чего выполняется деструктор для unicodeStr.
Ответы:
Спасибо за ссылку на статью MSDN. Это именно то, что я искал.
источник
Решение на самом деле намного проще, чем любые другие предложения:
Лучше всего то, что он не зависит от платформы. h2h :)
источник
reinterpret_cast
. Этот код не работает. Не используй. .char
обычно кодируется как ANSI. При кодировании ANSI значения от 128 до 255 интерпретируются с использованием текущей активной кодовой страницы. Помещение этих значений вwchar_t
(кодировку UTF-16 в Windows) не даст желаемого результата. Если быть точным, это работает ровно в 50% случаев. С учетом кодировки символов DBCS этот процент еще больше уменьшается.Если вы находитесь в среде ATL / MFC, вы можете использовать макрос преобразования ATL:
Затем вы можете использовать unicodeStr как LPCWSTR. Память для строки Unicode создается в стеке и освобождается, после чего выполняется деструктор для unicodeStr.
источник
Вместо использования std :: string вы можете использовать std :: wstring.
РЕДАКТИРОВАТЬ: Извините, это не более объяснительно, но мне нужно бежать.
Используйте std :: wstring :: c_str ()
источник
источник
LPCWSTR lpcwName = std :: wstring (strname.begin (), strname.end ()). C_str ()
источник