Поиск:

Ответ в темуСоздание новой темы Создание опроса
> wchar_t 
:(
    Опции темы
vikaz
Дата 9.2.2007, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: 10
Всего: 12



Ребят, как узнать длину строки wchar_t?

wchar_t *qwe;

Стандартные методы не подходят! заранее спасибо!


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
Anikmar
Дата 9.2.2007, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



wcslen не подойдет?
PM MAIL ICQ   Вверх
vikaz
Дата 9.2.2007, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: 10
Всего: 12



Да подошел! Большое человеческое спасибо!
А что это за переменная? Просто мне модуль готовый дали, а там этот тип! Где можно найти информацию, какие команды применимы к этому типу, и т.д. и т.п?


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
Anikmar
Дата 9.2.2007, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



wchar_t - это "широкие символы". Т.е не char, а по сути int - кодировка Unicode
PM MAIL ICQ   Вверх
AndAnd
Дата 9.2.2007, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 22.7.2006

Репутация: нет
Всего: 1



Примерно вот это:
Код

Кодировка, многобайтовые символы 
Мы уже упоминали о наличии разных кодировок букв, цифр, знаков препинания и т.д. Алфавит большинства европейских языков может быть представлен однобайтовыми числами (т.е. кодами в диапазоне от 0 до 255). В большинстве кодировок принято, что первые 127 кодов отводятся для символов, входящих в набор ASCII: ряд специальных символов, латинские заглавные и строчные буквы, арабские цифры и знаки препинания. Вторая половина кодов – от 128 до 255 отводится под буквы того или иного языка. Фактически, вторая половина кодовой таблицы интерпретируется по-разному, в зависимости от того, какой язык считается "текущим". Один и тот же код может соответствовать разным символам в зависимости от того, какой язык считается "текущим".

Однако для таких языков, как китайский, японский и некоторые другие, одного байта недостаточно – алфавиты этих языков насчитывают более 255 символов.

Перечисленные выше проблемы привели к созданию многобайтовых кодировок символов. Двухбайтовые символы в языке Си++ представляются с помощью типа wchar_t :

wchar_t wch;
Тип wchar_t иногда называют расширенным типом символов, и детали его реализации могут варьироваться от компилятора к компилятору, в том числе может меняться и количество байт, которое отводится под один символ. Тем не менее, в большинстве случаев используется именно двухбайтовое представление.

Константы типа wchar_t записываются в виде L'ab'.



PM MAIL   Вверх
HappyLife
Дата 9.2.2007, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 17.5.2006

Репутация: 4
Всего: 8



Это переменная Юникода.
два байта - один символ.
PM MAIL   Вверх
vikaz
Дата 9.2.2007, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: 10
Всего: 12



примерно понятно, спасибо всем!!! 


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
myk
Дата 2.3.2009, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 2.3.2009

Репутация: нет
Всего: нет



а я не понял)=. можно обьяснить или дать почитать как этими типами строковыми оперировать. вот к примеру

с екселем мучаюсь.

Cur=sheet.OlePropertyGet("Cells",index,j);
Cur.OlePropertySet("Value",DBGrid1->Fields[j-1]->AsString.c_str()); неробит

когда мучаюсь с fopen(SaveDialog1->FileName.c_str(),"w"); неробит

)= запарили эти widestring unicodestring wchar_t разъясните пожалуйста.

в 6 билдере AnsiString.c_str() приводил к char, а в билдере 2009 к wchar_t.  smile  разбиратся
PM MAIL   Вверх
Alexeis
Дата 2.3.2009, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



wchar_t может быть либо 2 либо 4 байта, потому нужно всегда проверять.
В Билдере String это unicodestring строка из wchar_t символов

wchar_t это аналог char только размером не байт. Если нужно ему присвоить значение то это будет выглядеть так
wchar_t ch = L'C';
Если это строка
wchar_t *ch = L"Строка";


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
myk
Дата 2.3.2009, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 2.3.2009

Репутация: нет
Всего: нет



о том что для выражений L"XXX" работает я понял, непонял как 

OlePropertySet("Value",DBGrid1->Fields[j-1]->AsString.c_str());
fopen(SaveDialog1->FileName.c_str(),"w");

сделать чаром
PM MAIL   Вверх
mrbrooks
Дата 2.3.2009, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Цитата(myk @  2.3.2009,  14:11 Найти цитируемый пост)
сделать чаром 

вместо с_str() использовать w_str()
PM MAIL   Вверх
rthsobakas
Дата 2.3.2009, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 562
Регистрация: 20.9.2007

Репутация: нет
Всего: -1



myk
Цитата

)= запарили эти widestring unicodestring wchar_t разъясните пожалуйста.

в 6 билдере AnsiString.c_str() приводил к char, а в билдере 2009 к wchar_t.    разбиратся

ага... меня тоже это напрягает.

У меня проблем.
 код
Код

Edit1->Text=Code_Dec(Edit1->Text.c_str(),'A');

нажимаю Ф9.
[BCC32 Error] PTestDll.cpp(19): E2034 Cannot convert 'wchar_t *' to 'char *'
[BCC32 Error] PTestDll.cpp(19): E2342 Type mismatch in parameter 's' (wanted 'char *', got 'wchar_t *')

Ф-ия  Code_Dec выглядит так
Код

char * Code(char *s,char Key){
 for (int i = 0;; i++) {
   if (s[i]=='\0') break;
   s[i]=s[i] ^ Key;
 }
return s;
}


И что такое L??? все пишут перед строкой

Это сообщение отредактировал(а) rthsobakas - 2.3.2009, 22:53
PM   Вверх
Alexeis
Дата 2.3.2009, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



плюс ко всем fopen заменяется на _wfopen

Цитата(rthsobakas @  2.3.2009,  21:35 Найти цитируемый пост)
И что такое L??? все пишут перед строкой

Признак строки в юникоде. От слова Long я думаю.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
myk
Дата 3.3.2009, 04:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 2.3.2009

Репутация: нет
Всего: нет



Цитата( mrbrooks)

вместо с_str() использовать w_str()
 в 2009 билдере c_str() и w_str() свойства типа wchar_t. как же быть то (=

OlePropertySet("Value",DBGrid1->Fields[j-1]->AsString.с_str()); открывается асм отладчик (не пашет в 2009 билдере в пред версиях c_str() был char)
OlePropertySet("Value",DBGrid1->Fields[j-1]->AsString); оле выдает сообщение о неверном типе переменной из за этой строки

Цитата( Alexeis)

плюс ко всем fopen заменяется на _wfopen

пробовал(=

out=_wfopen(SaveDialog1->FileName.w_str(),"w");
[BCC32 Error] Unit1.cpp(127): E2034 Cannot convert 'const char *' to 'const wchar_t *'
[BCC32 Error] Unit1.cpp(127): E2342 Type mismatch in parameter '__mode' (wanted 'const wchar_t *', got 'const char *')

PM MAIL   Вверх
mrbrooks
Дата 3.3.2009, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Цитата(myk @  3.3.2009,  04:28 Найти цитируемый пост)
в 2009 билдере c_str() и w_str() свойства типа wchar_t.

во-первых метод, а не свойство.
во-вторых - точно возвращают одинаковый тип.  smile 
Цитата(myk @  3.3.2009,  04:28 Найти цитируемый пост)
как же быть то (=

разбираться.
PM MAIL   Вверх
myk
Дата 3.3.2009, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 2.3.2009

Репутация: нет
Всего: нет



никто на билдере не пишет чтоли?(= как мне в ексель записывать wchar_t ? другим методом или всетаки есть какие то функции преобразования

Это сообщение отредактировал(а) myk - 3.3.2009, 10:06
PM MAIL   Вверх
Alexeis
Дата 3.3.2009, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



Цитата(myk @  3.3.2009,  03:28 Найти цитируемый пост)
out=_wfopen(SaveDialog1->FileName.w_str(),"w");

Опять жеж про L забыл

Код

out=_wfopen(SaveDialog1->FileName.w_str(), L"w");



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
rthsobakas
Дата 3.3.2009, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 562
Регистрация: 20.9.2007

Репутация: нет
Всего: -1



Цитата

Однако для таких языков, как китайский, японский и некоторые другие, одного байта недостаточно – алфавиты этих языков насчитывают более 255 символов.

блин... во всем китайцы виноваты. 

Alexeis, дык ниче у него не переконвертируется w_str() и с_str() в  wchar_t  переводят.
http://www.sql.ru/forum/actualthread.aspx?tid=577447

Цитата

NAME
       wcsrtombs - convert a wide-character string to a multibyte string

SYNOPSIS
       #include <wchar.h>

       size_t wcsrtombs(char *dest, const wchar_t **src,
                        size_t len, mbstate_t *ps);

CONFORMING TO
       C99.


http://www.programmersforum.ru/showthread.php?t=25474

Цитата

Нужно конвертировать строку wchar_t* в char*, чтобы использовать в функции strcpy. Есть функция WideCharToMultiByte, но хотелось бы что-нить попроще.



Цитата

#include <windows.h>
#include <lm.h>
#include <stdio.h>

BOOL GetFullName( char *UserName, char *Domain, char *dest )
{
    WCHAR wszUserName[UNLEN+1];          // Unicode user name
    WCHAR wszDomain[256]; 
    LPBYTE ComputerName;

    struct _SERVER_INFO_100 *si100;  // Server structure
    struct _USER_INFO_2 *ui;         // User structure

// Convert ANSI user name and domain to Unicode

    MultiByteToWideChar( CP_ACP, 0, UserName,
        strlen(UserName)+1, wszUserName,   
     sizeof(wszUserName)/sizeof(wszUserName[0]) );
    MultiByteToWideChar( CP_ACP, 0, Domain,
        strlen(Domain)+1, wszDomain, sizeof(wszDomain)/sizeof(wszDomain[0]) );

// Get the computer name of a DC for the domain.

    NetGetDCName( NULL, wszDomain, &ComputerName );

// Look up the user on the DC.

    if( NetUserGetInfo( (LPWSTR) ComputerName,
        (LPWSTR) &wszUserName, 2, (LPBYTE *) &ui ) )
    {
        printf( "Error getting user information.\n" );
        return( FALSE );
    }

// Convert the Unicode full name to ANSI.

    WideCharToMultiByte( CP_ACP, 0, ui->usri2_full_name, -1,
        dest, 256, NULL, NULL );

    return (TRUE);
}




Если честно , то я плохо понял как конвертировать.
если кто понял, то как относительно моего примера будет?
Код

Edit1->Text=Code_Dec(Edit1->Text.c_str(),'A');


Код

char * Code(char *s,char Key){
 for (int i = 0;; i++) {
   if (s[i]=='\0') break;
   s[i]=s[i] ^ Key;
 }
return s;
}


Добавлено через 6 минут и 3 секунды
CP_ACP 
The current system Windows ANSI code page. This value can be different on different computers, even on the same network. It can be changed on the same computer, leading to stored data becoming irrecoverably corrupted. This value is only intended for temporary use and permanent storage should be done using UTF-16 or UTF-8 if possible. 

Перевод сократа

Цитата

CP_ACP
Текущая системная кодовая страница Windows ANSI. Эта величина может быть другой в других компьютерах, даже в той же сети. Может быть изменено в том же компьютере, ведущем к загруженному становлению данных irrecoverably искаженных. Эта величина только предназначена для временного использования и постоянная память должна быть сделана используя UTF-16 или UTF-8 если возможно


Это сообщение отредактировал(а) rthsobakas - 3.3.2009, 12:59
PM   Вверх
rthsobakas
Дата 3.3.2009, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 562
Регистрация: 20.9.2007

Репутация: нет
Всего: -1



http://msdn.microsoft.com/en-us/library/bb202786.aspx

int MultiByteToWideChar(
  UINT CodePage,
  DWORD dwFlags,
  LPCSTR lpMultiByteStr,
  int cbMultiByte,
  LPWSTR lpWideCharStr,
  int cchWideChar
);
PM   Вверх
rthsobakas
Дата 3.3.2009, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 562
Регистрация: 20.9.2007

Репутация: нет
Всего: -1



[ILINK32 Error] Fatal: Unable to open file '相Ⴜ"Ⴔ"農相ꊊ相ꀁ盞勑ƊĄ.OBJ'

Возникает если

Код

Edit1->Text=Code_Dec(Edit1->Text.c_str(),'A');


wchar_t * Code(wchar_t *s,char Key){
 for (int i = 0;; i++) {
   if (s[i]=='\0') break;
   s[i]=s[i] ^ Key;
 }
return s;
}

PM   Вверх
myk
Дата 4.3.2009, 05:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 2.3.2009

Репутация: нет
Всего: нет



я попробовал это исполнять сперва тоже чето не открывалось но потом пересоздал проект и все сделал внимательно((=

а по поводу чаров надо помоеум другую среду юзать, builder 2007 не имеет таких галов ну и по приятнее чем builder 6 .

Это сообщение отредактировал(а) myk - 4.3.2009, 05:13
PM MAIL   Вверх
myk
Дата 12.3.2009, 04:48 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 2.3.2009

Репутация: нет
Всего: нет



Код

UnicodeString K="sdfsdfsd";
char *W = K.t_str();


вот так работает(= неужели никто не знал про этот метод??
PM MAIL   Вверх
mrbrooks
Дата 12.3.2009, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Цитата(myk @  12.3.2009,  04:48 Найти цитируемый пост)
вот так работает(= неужели никто не знал про этот метод?? 

такой подход ошибочный. это прокатит только в Бормане. для работы с массивами символов предусмотрены функции копирования.
PM MAIL   Вверх
myk
Дата 12.3.2009, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 2.3.2009

Репутация: нет
Всего: нет



это чисто пример, как приводить к чару из юникода. мне надо было через оле в ексель передавать чар строки, другие он не принимал ругаясь ошибками, .c_str() не помогал а .t_str() делает.

Это сообщение отредактировал(а) myk - 13.3.2009, 05:03
PM MAIL   Вверх
ZAK
Дата 18.3.2009, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 9.7.2007

Репутация: нет
Всего: нет



Вынужден был давеча портировать проект с VC++ 6.0 на VC++ 2005 и пользуясь инструкцией, написанной менеджером проекта, для конвертирования в/из Unicode широко использовал макросы ATL. Для констант - _T(""), для переменных CA2T(), CT2A(), CW2T() и т.п.

http://msdn.microsoft.com/ru-ru/library/87zae4a3.aspx
http://msdn.microsoft.com/ru-ru/library/805c56f8.aspx
PM MAIL   Вверх
batraq
Дата 14.4.2009, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 12.4.2007

Репутация: нет
Всего: нет



А может кто знает в std::wstring и вообще в STL есть готовые функции чтобы гонять строки из верхнего регистра в нижний и наоборот?
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1092 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.