LINUX.ORG.RU

wchar_t mac os c++ Qt

 , ,


0

3

Суть проблемы такова:если строка русских символов типа mas[]=«фывуу»; нужа возможность обработки(вызова) каждого символа отдельно. Столкнулся с тем,что char строки не поддерживают кириллицу из-за ее двухбайтовости.Прочитал про wchar_t,но увы он у меня почему то не работает

int main() {
 wchar_t s[]=L"привет";
 wcout << s << endl;
 return 0;
}
Я так понял,что нужна русская локаль,но ни SetLocale,ни wcin.imbue(locale(«rus_rus.866»)); не помогают. Подскажите что делать?


Ответ на: комментарий от CrossFire

А это у препода в универе надо спросить. Надо сделать 2 вариантами:1)С помощью стринг строк 2)Си строк

mike_l
() автор топика

А при чём тут Qt? Если он используется в проекте, то лучше используй QString. Зачем в плюсах использовать сишные методы для работы со строками ([const] char *), когда есть готовые классы?

Далее, кириллица совсем не обязательно будет двухбайтовой. Это зависит от текущей локали. И IBM 866 — целиком однобайтовая локаль. Для двухбайтовой тебе надо что-то типа UTF-16. А вообще:

The ISO/IEC 10646:2003 Unicode standard 4.0 says that:

“The width of wchar_t is compiler-specific and can be as small as 8 bits. Consequently, programs that need to be portable across any C or C++ compiler should not use wchar_t for storing Unicode text. The wchar_t type is intended for storing compiler-defined wide characters, which may be Unicode characters in some compilers.”

И ещё один момент: если файл записан в (допустим) юникоде, а ты читаешь символы вот так и настроил однобайтовую локаль, то тебя ждёт несоответствие того, что написано в файле, с тем, что будет записано в память. Потому что кириллица в данном случае действительно будет занимать по два байта, а текст интерпретируется по одному.

А, ещё один момент. Сам не проверял, но читал, что на *никсах char может занимать и больше одного байта, и всякие widechar просто не нужны, в то время как на виндах размер строго определён

XMs ★★★★★
()
Ответ на: комментарий от XMs

Qt не причем,просто я юзаю Qt creator как иде. Там даже считывание строк с файла,а просто в самой программе объявление что то типа:

int main() {
wchar_t s[]=L"яблоки груша арбуз и тд";
wcout <<s;
}
Ничего не выводит. Си-шные методы надо использовать по условию задания. Ну не знаю,у меня на маке в gcc char занимает ровно 1 байт,может я просто не так объявляю?

mike_l
() автор топика
Ответ на: комментарий от mike_l

Раз у препода в универе, что вангую форточки на компах и cp-1251 в качестве кодировки. В этом случае используй char*, должно сработать.

Вот так работает точно:

#include <iostream>
#include <cstdlib>

int main()
  {
        char s[] = "Тест";
        std::cout << s << std::endl;
        return EXIT_SUCCESS;
  }
xms@XMs-desktop ~/projects/charsizetest $ g++ main.cpp 
xms@XMs-desktop ~/projects/charsizetest $ ./a.out 
Тест
xms@XMs-desktop ~/projects/charsizetest $

XMs ★★★★★
()
Ответ на: комментарий от XMs

Раз у препода в универе, что вангую форточки на компах и cp-1251 в качестве кодировки.

Если форточки еще деревянные, то в консоли будет cp866, и исходник нужно кодировать в нее чтобы выводилось правильно)

CrossFire ★★★★★
()
Ответ на: комментарий от CrossFire

Если форточки еще деревянные, то в консоли будет cp866

Об этом не подумал. Благодарю, надо будет освежить память

XMs ★★★★★
()
Ответ на: комментарий от XMs

Мне на самом деле не суть,студия там или нет.Я со своим ноутом хожу и на экзамен тоже. #include <iostream> #include <cstdlib>

int main() { char s[] = «Тест»; std::cout << s << std::endl; return EXIT_SUCCESS; } Так так и у меня работает,другое дело как мне посимвольно разбирать строки.Мне надо упорядочить слова в строке по алфавиту. А если просто вывести cout<<s[0]; то выведет вопрос т.к. тут уже 2х байтовый символ.

mike_l
() автор топика
Ответ на: комментарий от DELIRIUM

Сам не проверял, но читал

Т. е. не утверждаю, а пересказываю то, о чём где-то читал. Специально добавил, чтоб не выглядело как утверждение

XMs ★★★★★
()
Ответ на: комментарий от CrossFire

Скорее попробую уломать препода на QString и QChar.Только вот умеет ли QString или QChar работать с русскими символами?

mike_l
() автор топика
Ответ на: комментарий от m0rph

Тест?Не совсем понимаю ваш посыл.Простите если сильно туплю со строками и символами работаю 3 день.

mike_l
() автор топика
Ответ на: комментарий от mike_l

а чем QChar или QString выводится?А то он как-то конфилктует с cout.

Вообще говоря qDebug() << str;, но есть метод .toStdString() для работы со стандартными потоками вывода.

CrossFire ★★★★★
()
Последнее исправление: CrossFire (всего исправлений: 1)
Ответ на: комментарий от XMs

если файл записан в (допустим) юникоде

Файл не может быть в юникоде.

Юникод — это таблица соответствия между номером и символом. Он не определяет, как этот номер сохраняется в файл. Для этого существуют кодировки: UTF-8, UTF-16LE, UTF-16BE и так далее. Они определяют правила, по которым номер символа отображается в последовательность байт.

i-rinat ★★★★★
()
Ответ на: комментарий от DELIRIUM

Не верно. sizeof(char) == 1 по стандарту, однако никто не обещает, что это байты. Также как никто не обещает, что в байте ровно 8 бит.

KivApple ★★★★★
()
Последнее исправление: KivApple (всего исправлений: 1)
Ответ на: комментарий от i-rinat

Неточно выразился. Под юникодом имелась ввиду одна из кодировок, конечно

XMs ★★★★★
()

Столкнулся с тем,что char строки не поддерживают кириллицу из-за ее двухбайтовости

man utf8

annulen ★★★★★
()
Ответ на: комментарий от CrossFire

Ну в общем с QString я написал.Но что делать с Си-строками? Я так понимаю,что QChar имеет большую разницу по сравнию с char. И почему-то QChar не поддерживает юникод.Говорит что слишком большой символ.

mike_l
() автор топика
Ответ на: комментарий от mike_l

Так wstring как и wchar требует русскую локаль.

std::locale loc("ru_RU.UTF-8");
std::locale::global(loc);


Или, чтобы взять из переменных среды:

std::locale loc("");
std::locale::global(loc);

proud_anon ★★★★★
()

Под виндой по дефолту используются 1-байтовые кодировки типа CP_ACP (ru: cp1251), CP_OEM (ru: ibm866), так что там в wchar_t нет необходимости (в рамках задачи ТСа).

Под линуксом используется utf-8 (которого во времена стабилизации WinAPI просто не было). Можно через codecvt конвертировать символы перед выводом.

quiet_readonly ★★★★
()
Последнее исправление: quiet_readonly (всего исправлений: 1)
Ответ на: комментарий от CrossFire

и исходник нужно кодировать в нее чтобы выводилось правильно

MinGW может перекодировать сам начиная от -finput-charset

quiet_readonly ★★★★
()
Ответ на: комментарий от mike_l

Тест?Не совсем понимаю ваш посыл.Простите если сильно туплю со строками и символами работаю 3 день.

Опечатался, имелся в виду исходный текст.

m0rph ★★★★★
()
Ответ на: комментарий от annulen

В wstring и wchar_t utf8 не используется :) В линуксе/яблооси там UTF32, в винде UTF16, т.е. если пользоваться wstring/wchar_t, ТСу придется строки туда-сюда конвертировать из char, в который таки да utf8 помещается — вкурить фасетки и std::codecvt (а без фасеток это много байто-баттсекса), либо... не пользоваться wstring/wchar_t. Но u8-литералы появились в С++11. «издержки, издержки эвривер!» (с)

slackwarrior ★★★★★
()
Ответ на: комментарий от slackwarrior

а я char* имел в виду, про который ТС написал что он не умеет кириллицу

annulen ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.