Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Unicode строки на С++


Автор: TNT86 1.12.2006, 14:15
Подскажите плиз какую-нибудь юникодовскую строку в С++ и метод ее приведения к char*

Автор: Alexeis 1.12.2006, 14:32
юзай WideCharToMultiByte()

Автор: vinter 1.12.2006, 14:35
Код

wchar_t *pString = "Hello";

WideCharToMultiByte перевод юникода в аски

Автор: Fazil6 1.12.2006, 15:16
хм...
тогда уж так
Код

wchar_t *pString = L"Hello";

вообще лучше
std::wstring использовать.
для приведения туда сюда удобнее всего использовать класс _bstr_t из comutil.h, у него определены соответствующие операторы и конструкторы

Добавлено @ 15:19 
Код

        std::string str = "Превед";

        _bstr_t wstr(str.c_str());
        const char *p = wstr;
        std::wstring s1(wstr);

Автор: Daevaorn 1.12.2006, 18:52
Fazil6, 
Код

 std::string str = "Превед";
 std::wstring s1( str.begin(), str.end() );

smile

Автор: Akeem 1.12.2006, 20:48
А можно привести пример перевода char* в wchar_t* 

Я мучаюсь-мучаюсь не могу перевести.

Автор: Solomon 1.12.2006, 23:37
Цитата

Перекодировка строк из Unicode в ANSI и обратно

Windows-функция MultiByteToWideChar преобразует мультибайтовые символы строки в широкобайтовые:

int MultiBytoToWideChar(
UINT uCodePage,
DWORD dwFlags,
PCSTR pMultiByteStr,
int cchMultiByte,
PWSTR pWideCharStr,
int cchWideChar);


Параметр uCodePage задает номер кодовой страницы, связанной с мультибайтовой строкой. Параметр dwFlags влияет на преобразование букв с диакритическими знаками. Обычно эти флаги не используются, и dwFlags равен 0. Параметр pMultiByteStr указывает на преобразуемую строку, a cchMultiByte определяет ее длину в байтах Функция самостоятельно определяет длину строки, если cchMultiByte равен -1.

Unicode-версия строки, полученная в результате преобразования, записывается в буфер по адресу, указанному в pWideCharStr. Максимальный размер этого буфера (в символах) задается в параметре cchWideCbar. Если он равен 0, функция ничего не преобразует, а просто возвращает размер буфера, необходимого для сохранения результата преобразования. Обычно конверсия мультибайтовой строки в ее Unicode-эквивалент проходит так:

1. Вызывают MultiByteToWideChar, передавая NULL в параметре pWideCharStr и 0 в
параметре cchWideChar.
2. Выделяют блок памяти, достаточный для сохранения преобразованной стро- 
ки. Его размер получают из предыдущего вызова MultiByteToWideChar.

3. Снова вызывают MultiByteToWideChar, на этот раз передавая адрес выделенно го буфера в параметре pWideCharStr, а размер буфера, полученный при первом обращении к этой функции, — в параметре cchWideChar.
4. Работают с полученной строкой.
5. Освобождают блок памяти, занятый Unicode-строкой.

Обратное преобразование выполняет функция WideCharToMultiByte

int WideCharToMultiByte(
UINT uCodePage,
DWORD dwFlags,
PCWSTR pWideCharStr,
int cchWideChar,
PSTR pMultiByteStr,
int cchMultiByte,
PCSTR pDefaultChar,
PBOOL pfUsedDefaultChar);


Она очень похожа на MultiByteToWideChar. И опять uCodePage определяет кодовую страницу для строки — результата преобразования Дополнительный контроль над процессом преобразования дает параметр dwFlags. Его флаги влияют на символы с диакритическими знаками и на символы, которые система не может преобразовать. Такой уровень контроля обычно не нужен, и dwFlags приравнивается 0

Пapaметр pWideCharStr указывает адрес преобразуемой строки, a cchWideChar задает ее длину в символах. Функция сама определяет длину исходной строки, если cchWideChar равен -1.

Мультибайтовый вариант строки, полученный в результате преобразования, записывается в буфер, на который указывает pMultiByteStr, Параметр cchMultiByte определяет максимальный размер этого буфера в байтах Передав нулевое значение в ccbMultiByte, Вы заставите функцию сообщить размер буфера, требуемого для записи результата. Обычно конверсия широкобайтовой строки в мультибайтовую проходит в той
же последовательности, что и при обратном преобразовании

Очевидно, Вы заметили, что WideCharToMultiByte принимает на два параметра больше, чем MultiByteToWideCbar, это pDefauItChar pfUsedDefaultChar. Функция WideCharToMultiByte использует их, только если встречает широкий символ, не представленный в кодовой странице, на которую ссылается uCodePage Если его преобразование невозможно, функция берет символ, на который указывает pDefaultChar. Если этот параметр равен NULL (как обычно и бывает), функция использует системный символ по умолчанию. Таким символом обычно служит знак вопроса, что при операциях с именами файлов очень опасно, поскольку он является и символом подстановки.

Параметр pfUsedDefaultChar указывает на переменную типа BOOL, которую функция устанавливает как TRUE, если хоть один символ из широкосимвольной строки не преобразован в свой мультибайтовый эквивалент. Если же все символы преобразованы успешно, функция устанавливает переменную как FALSE. Обычно Вы передаете NULL в этом параметре.

Автор: Alexeis 1.12.2006, 23:47
Цитата(Akeem @  1.12.2006,  20:48 Найти цитируемый пост)
Я мучаюсь-мучаюсь не могу перевести. 

Код

  char* str1 = "Some lines";
  wchar_t *str2;
  str2 = new wchar_t[strlen(str1)+1];
  MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str1, -1, str2, strlen(str1) * 2);

Автор: Akeem 2.12.2006, 00:19
сенк всем. Но уже и сам до этого дошел. 
Windows SDK cool но оно сильно глубоко.


Автор: Oleg_Ci 2.12.2006, 07:25
Так можно...
wchar_t -> char
Код

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

int main(int argc, char *argv[])
{ 
    const int size = 100;
    wchar_t wstr[size] = L"Русские буковки";
    char str[size];
    setlocale(LC_ALL, ".866");
    wcstombs( str, wstr, size ); // <<<<<<<<<<<<<<
    puts( str );
    getchar(); // пауза
    return 0;
}
char -> wchar_t
Код

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{ 
    const int size = 100;
    wchar_t wstr[size]={0};
    char str[size] = "asdfg";
    mbstowcs( wstr, str, size ); // <<<<<<<<<<<<<<
    printf("%ls", wstr );
    getchar(); // пауза
    return 0;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)