Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
 QString, QObject::tr(), unicode etc...  [new]
petrav
Member

Откуда:
Сообщений: 2430
Немного сумбурно постараюсь пояснить.

В доке на QString написано, что хранит строки в 2-х байтной кодировке. Но конструкторы принимают только char*. Вот такое в студии у меня не работает (крякозябры).

QString qs = "привет";

Почитал, нашел что можно установить кодер под определенную кодировку, но не комильфо, имхо. Забавно, вот такое работает:

std::wstring ws = L"привет";
QString qs = QString::fromStdWString(ws);

Вопрос первый: почему QString принимает в конструкторах/операторах только char? Почему не wchar_t и почему не хочет кушать строки L"строка"? Ведь все равно преобразует в два байта на символ.

Вопрос второй: почему в проекте под студию Qt-плугин запретил wchar_t рассматривать как встроенный тип? Если вернуть обратно - приложение не компилируется.

И самое главное. Есть функциональный код (логика) написанный с std::wstring и строками L"привет". Как все это совместить теперь с QObject::tr() ?!

Переписывание на QString не вариант. QObject::tr() возвращает QString - т.е. в двух байтах на символ. => std::wstring оставляем.

Но как поведет себя система локализации если в QObject::tr() русский текст? Складывается впечатление, что в любом случае лучше программу писать на английском. А потом переводить лингвистом на русский. А для преобразований в std::wstring юзать макрос:

#define my_tr(str) QObject::tr(str).toStdWString().

Но два временных объекта, там где раньше был один и оба завязаны на использование динамической памяти.

Последний вопрос: так как совместить с QObject::tr() подобный код половчее?
4 июн 10, 15:43    [8893771]     Ответить | Цитировать Сообщить модератору
 Re: QString, QObject::tr(), unicode etc...  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34608

petrav wrote:
> В доке на QString написано, что хранит строки в 2-х байтной кодировке.
> Но конструкторы принимают только char*. Вот такое в студии у меня не
> работает (крякозябры).

2 момента, которые тебе надо понять:
-- QString, и вообще С++ программы, не хранят строки в какой-то определённой
кодировке. Хранятся байты, обозначающие символы, а вот какая там кодировка
зависит только от того, какую ты туда положил. Есть конечно ещё wchar_t и char,
но это отдельная тема.

-- в Linux и *nix люди работают умные, и они понимают, что т.н. юникод
(а именно -- UCS2) никому не нужен ни на фиг, что ежели символы
всё равно переменного размера, то зачем хранить 2 или 4 байта минимально на
символ, если можно хранить только 1-н. Поэтому в этих системах (да и вообще
в GNU) люди предпочитают кодировку UTF-8. А UTF-8 в С/С++ -- это char*.

(кстати, wchar_t в GNU вообще 4 байта, а не два, что делает использование
UTF-8 ещё более выгодным).

Posted via ActualForum NNTP Server 1.4

4 июн 10, 16:02    [8894015]     Ответить | Цитировать Сообщить модератору
 Re: QString, QObject::tr(), unicode etc...  [new]
petrav
Member

Откуда:
Сообщений: 2430
MasterZiv

petrav wrote:
> В доке на QString написано, что хранит строки в 2-х байтной кодировке.
> Но конструкторы принимают только char*. Вот такое в студии у меня не
> работает (крякозябры).

2 момента, которые тебе надо понять:
-- QString, и вообще С++ программы, не хранят строки в какой-то определённой
кодировке. Хранятся байты, обозначающие символы, а вот какая там кодировка
зависит только от того, какую ты туда положил. Есть конечно ещё wchar_t и char,
но это отдельная тема.

Я догадываюсь. Вот проблема в том как понять, что конкретно попало в бинарный файл и в какой кодировке? И от чего это зависит?

MasterZiv
-- в Linux и *nix люди работают умные, и они понимают, что т.н. юникод
(а именно -- UCS2) никому не нужен ни на фиг, что ежели символы
всё равно переменного размера, то зачем хранить 2 или 4 байта минимально на
символ, если можно хранить только 1-н. Поэтому в этих системах (да и вообще
в GNU) люди предпочитают кодировку UTF-8. А UTF-8 в С/С++ -- это char*.

Да, но, тем не менее, QString - это два байта на символ. Не KDE ли написан на Qt?

Qt Assistant
The QChar class provides a 16-bit Unicode character.

In Qt, Unicode characters are 16-bit entities without any markup or structure. This class represents such an entity. It is lightweight, so it can be used everywhere. Most compilers treat it like a unsigned short.

Не возникало проблем с неясностью с utf-8?.. Хочется в буфер скопировать содержимое std::string. std::string::size/length() - это кол-во символов? А размер буфера какой нужен? Или это размер буфера под UTF8? А если мне нужно кол-во символов?

Тут типичный выбор: или память, или скорость...

MasterZiv
(кстати, wchar_t в GNU вообще 4 байта, а не два, что делает использование
UTF-8 ещё более выгодным).

Ну если программа заточена на обработку гигабайтов строк, то может быть. Но много ли таких программ?
4 июн 10, 16:31    [8894372]     Ответить | Цитировать Сообщить модератору
 Re: QString, QObject::tr(), unicode etc...  [new]
White Owl
Member

Откуда:
Сообщений: 12542
Правильный ответ на главный вопрос топика:
petrav
в любом случае лучше программу писать на английском. А потом переводить лингвистом на русский.



petrav
А для преобразований в std::wstring юзать макрос:
А это уже искание себе проблем.
Если пишешь на Qt - не используй std. Qt полностью покрывает все что есть в стандартной библиотеке, а смешивать две библиотеки это всегда источник проблем и неожиданных глюков.
4 июн 10, 17:27    [8895055]     Ответить | Цитировать Сообщить модератору
 Re: QString, QObject::tr(), unicode etc...  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
MasterZiv

-- QString, и вообще С++ программы, не хранят строки в какой-то определённой
кодировке. Хранятся байты, обозначающие символы, а вот какая там кодировка
зависит только от того, какую ты туда положил. Есть конечно ещё wchar_t и char,
но это отдельная тема.


В юникоде они внутри все хранят. Не вводи в заблуждение.
И это не зависит от того, какую кодировку ты туда положил.
Этим рулят кодеки (которые можно вешать в том числе на tr)
4 июн 10, 17:56    [8895270]     Ответить | Цитировать Сообщить модератору
 Re: QString, QObject::tr(), unicode etc...  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
White Owl

Если пишешь на Qt - не используй std. Qt полностью покрывает все что есть в стандартной библиотеке, а смешивать две библиотеки это всегда источник проблем и неожиданных глюков.


Ага :) было как то дело
конвертация std->QString стабильно валила AV, на хитрожопо собранной Qt (в сборке которой, так получилось, приняли участие аж три MSVC-ых компилятора)
4 июн 10, 17:58    [8895286]     Ответить | Цитировать Сообщить модератору
 Re: QString, QObject::tr(), unicode etc...  [new]
petrav
Member

Откуда:
Сообщений: 2430
White Owl
Правильный ответ на главный вопрос топика:
petrav
в любом случае лучше программу писать на английском. А потом переводить лингвистом на русский.

Ок, спасибо.

White Owl
petrav
А для преобразований в std::wstring юзать макрос:
А это уже искание себе проблем.
Если пишешь на Qt - не используй std. Qt полностью покрывает все что есть в стандартной библиотеке, а смешивать две библиотеки это всегда источник проблем и неожиданных глюков.

Ну тут не соглашусь. Все же переход между велосипедами Qt и стандартной библиотекой (+boost или еще какие либы) я осуществлю только на промежутке "логика-интерфейс". Хотя вот tr()... Но на этот раз я буду непреклонен, уже накушался, спасибо... =)))
4 июн 10, 18:03    [8895326]     Ответить | Цитировать Сообщить модератору
 Re: QString, QObject::tr(), unicode etc...  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34608

petrav wrote:

> Я догадываюсь. Вот проблема в том как понять, что конкретно попало в
> бинарный файл и в какой кодировке? И от чего это зависит?

От тебя это зависит. В какой хранишь, в какой кладёшь, в той и оно "попало".

> Да, но, тем не менее, QString - это два байта на символ. Не KDE ли
> написан на Qt?

Сомневаюсь. Либо 4-ре, либо 1-6.

> Не возникало проблем с неясностью с utf-8?.. Хочется в буфер скопировать
> содержимое std::string. std::string::size/length() - это кол-во
> символов?

нет, байт.

А размер буфера какой нужен? Или это размер буфера под UTF8? А
> если мне нужно кол-во символов?

вычисляй, типа

size_t mbslen( const char* s )
{
size_t len = 0;
size_t chlen = 1;
mbstate_t mbstate;
memset( &mbstate, 0, sizeof(mbstate_t) );
const char* ch;

for( ch = s; ch && chlen && *ch; ch += chlen )
{
chlen = mbrlen( ch, MB_CUR_MAX, &mbstate );
if( chlen == (size_t) -1 || chlen == (size_t) -2 )
break;
if( chlen == 0 )
break;
++len;
}
return len;
}

Posted via ActualForum NNTP Server 1.4

4 июн 10, 18:46    [8895555]     Ответить | Цитировать Сообщить модератору
 Re: QString, QObject::tr(), unicode etc...  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34608

Gluk (Kazan) wrote:

> В юникоде они внутри все хранят. Не вводи в заблуждение.

Я не говорил, как они хранят. Я объяснял, почему на входе
не wchar_t* , а char*.

Posted via ActualForum NNTP Server 1.4

4 июн 10, 18:47    [8895564]     Ответить | Цитировать Сообщить модератору
 Re: QString, QObject::tr(), unicode etc...  [new]
petrav
Member

Откуда:
Сообщений: 2430
MasterZiv

petrav wrote:

> Я догадываюсь. Вот проблема в том как понять, что конкретно попало в
> бинарный файл и в какой кодировке? И от чего это зависит?

От тебя это зависит. В какой хранишь, в какой кладёшь, в той и оно "попало".

Ну если я беру данные из некоторого источника (например, файла) - понятно, что от меня зависит в какой кодировке это окажется в буфере.

Но если я пишу в студии строковую константу прямо в коде. В какой кодировке она окажется в бинарном файле? От чего это зависит?

От кодировки файла cpp?
От макросов _UNICODE, _MBCS?
От строки "привет" или L"привет"?

А если тот же самый код в gcc ?

В общем, бардарк и, как сказали выше, лучше на англ. писать программы. Все равно в случае Qt метод tr() использует переданную строку больше как некоторый идентификатор.

MasterZiv
> Да, но, тем не менее, QString - это два байта на символ. Не KDE ли
> написан на Qt?

Сомневаюсь. Либо 4-ре, либо 1-6.

Не сомневайтесь.

MasterZiv
> Не возникало проблем с неясностью с utf-8?.. Хочется в буфер скопировать
> содержимое std::string. std::string::size/length() - это кол-во
> символов?

нет, байт.

О, отлично.
4 июн 10, 20:55    [8895929]     Ответить | Цитировать Сообщить модератору
 Re: QString, QObject::tr(), unicode etc...  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34608

petrav wrote:

> Но если я пишу в студии строковую константу прямо в коде. В какой
> кодировке она окажется в бинарном файле? От чего это зависит?

значения переменной LANG.

напр.
ru_RU.UTF-8 -- UTF-8
ru_RU.KOI8-R -- кои-8

Это конечно в юниксе.
А в винде -- ANSI.

> От кодировки файла cpp?

Да, но компилятор про неё не знает.

> От макросов _UNICODE, _MBCS?
> От строки "привет" или L"привет"?

_UNICODE, _MBCS на кодировку файлов не влияет.
Ну, и это только в VC.

> А если тот же самый код в gcc ?

Уже сказал.

Posted via ActualForum NNTP Server 1.4

5 июн 10, 11:19    [8896813]     Ответить | Цитировать Сообщить модератору
Все форумы / C++ Ответить