2012-10-18 5 views
2

Я уверен, что этот вопрос задают много, но я просто хочу убедиться, что нет лучшего способа сделать это.C string to wide C string

В принципе, у меня есть const char *, который указывает на строку C с нулевым завершением. У меня есть другая функция, которая ожидает, что const wchar_t * указывает на строку с одинаковыми символами.

на некоторое время, я пытался сделать это следующим образом:

size_t newsize = strlen(myCString) + 1; 
    wchar_t * wcstring = new wchar_t[newsize]; 
    size_t convertedChars = 0; 

    mbstowcs_s(&convertedChars, wcstring, newsize, myCString, _TRUNCATE); 

    delete[] wcstring; 

Мне нужно сделать эти преобразования во многих местах, так как я имею дело с 3-библиотеками, которые ожидают один или другой. Это рекомендуемый способ сделать это?

+4

Это сильно зависит от предполагаемого кодирования 'сопзИте полукокс *' строки (которая может быть UTF-8, ISO-Latin-1, KOI -8, ...). Вы должны знать это кодирование. Вас может заинтересовать библиотека http://www.gnu.org/software/libiconv/. –

+0

Ты по существу на правильном пути. Вы можете получить правильный размер цели, выполнив сначала 'mbstowcs' с нулевым указателем. Не забудьте запустить 'std :: setlocale (" ");' в начале вашей программы. –

ответ

2

Что вы делаете, это очень рекомендуемый способ сделать это, предполагая, что ваши данные - это ASCII. Если у вас есть данные, отличные от ASCII, вам нужно знать, что такое его кодировка: UTF-8, Windows-1252, любой из вариантов ISO 8859, SHIFT-JIS и т. Д. Каждый из них нужно преобразовать по-другому ,

Единственное, что я бы изменил, было бы использовать mbstowcs вместо mbstowcs_s. mbstowcs_s доступен только в Windows, а mbstowcs - это стандартная функция C99, которая переносима. Конечно, если вы хотите избежать предупреждений об отказе от CRT с компилятором Microsoft, не полностью отключив их, отлично использовать макрос теста #if для использования mbstowcs для не-Windows-систем и mbstowcs_s для систем Windows.

Вы также можете использовать mbstowcs, чтобы получить длину преобразованной строки, предварительно пройдя через NULL для пункта назначения. Таким образом, вы можете избежать усечения независимо от того, сколько времени занимает строка ввода; однако он предполагает преобразование строки дважды.

Для конверсий, отличных от ASCII, я рекомендую использовать libiconv.

+1

На самом деле он не конвертируется из ASCII - он преобразуется из любого формата, подразумеваемого LC_CTYPE в вашей текущей локали, которая может быть ASCII или UTF-8 или что-то еще. –

+0

Возможно, вы также захотите посмотреть на mbsrtowcs (3), который является потокобезопасным, если вы передадите в него переменную состояния. Он имеет «безопасный» интерфейс и доступен в Windows и Linux. – rholmes

0

Вы не сказали, какие кодировки задействованы. Если у вас есть не мультибайтные строки, вы можете просто использовать это:

std::string a("hello"); 
std::wstring b(s.begin(), s.end()); 

const wchar_t *wcString= b.c_str();