Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: UTF-8 - 1 и 2 байта в 2  (Прочитано 971 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Kernel ops

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1388
    • Просмотр профиля
UTF-8 - 1 и 2 байта в 2
« : 24 Августа 2013, 23:54:16 »
Нужно ввести строку любого размера, нашел способ:
Код: (C) [Выделить]
string line;
getline(cin,line);
нужно преобразовать все в wchar_t, накалякал:
Код: (C) [Выделить]
wchar_t *getString() {
string line;
getline(cin,line);

int j=0; // Счетчик символов в result
wchar_t *result=new wchar_t [line.length()];

for(register int i=0; line[i]; i++) {
if(line[i]&0b10000000) {
result[j]=((0b100000000*((unsigned char)line[i]))|((unsigned char)line[i+1]));

i++;
j++;
}
else {
result[j]=((0b11000000|((unsigned char)line[i]>>6))*0b100000000)|(0b10000000|(((unsigned char)line[i])&0b00111111));

j++;
}
}

return result;
}
числовое значение такое-же, но в терминал выводятся вопросы. во-первых нужно разобраться с преобразованием, во-вторых, хорошо было бы найти способ ввода строки минуя string. пробовал fgetws и распределить по блокам, но fgetws считывает из введенной визуально строки, а не поток с клавиатуры
root@shkiper:~$mount -t btrfs /dev/head1 /mnt && ls /mnt | grep brain | xargs -i sh /mnt/{}

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: UTF-8 - 1 и 2 байта в 2
« Ответ #1 : 26 Августа 2013, 06:42:18 »
где-то здесь должен быть блюющий смайл

std::wstring line
std::getline(std::wcin, line)
Не?

Ну и для преобразования в широкие строки есть специальные функции так что не чего изобретать свои кривые кодеры, всё равно не получится

Оффлайн Kernel ops

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1388
    • Просмотр профиля
Re: UTF-8 - 1 и 2 байта в 2
« Ответ #2 : 26 Августа 2013, 09:00:54 »
все функции, что я находил - из win api :(
Код: (C) [Выделить]
#include <iostream>
#include <string>

using namespace std;

int main() {
wstring line;
getline(wcin, line);

wcout << line[0] << endl;

return 0;
}
с ascii работает, с кириллицей - нет
root@shkiper:~$mount -t btrfs /dev/head1 /mnt && ls /mnt | grep brain | xargs -i sh /mnt/{}

Оффлайн aSmile

  • Активист
  • *
  • Сообщений: 755
    • Просмотр профиля
Re: UTF-8 - 1 и 2 байта в 2
« Ответ #3 : 26 Августа 2013, 12:49:43 »
Код: (c) [Выделить]
setlocale(LC_ALL, "ru_RU.UTF8");В начале main'а попробуй вставить.

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7215
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: UTF-8 - 1 и 2 байта в 2
« Ответ #4 : 26 Августа 2013, 14:08:43 »
Kernel ops, а просто std::cin использовать не судьба? Чем он не устроил? И считывай его в std::string, а там уже преобразовывай в то, что тебе надо, но зачем?

Оффлайн Kernel ops

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1388
    • Просмотр профиля
Re: UTF-8 - 1 и 2 байта в 2
« Ответ #5 : 26 Августа 2013, 18:45:20 »
peregrine,
мне нужно получить строку и работать с символами по отдельности
root@shkiper:~$mount -t btrfs /dev/head1 /mnt && ls /mnt | grep brain | xargs -i sh /mnt/{}

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: UTF-8 - 1 и 2 байта в 2
« Ответ #6 : 28 Августа 2013, 05:41:42 »
peregrine,
не надо учить всякой хрени

Kernel ops,
гуглить locale и примеры работы с ней

Оффлайн Kernel ops

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1388
    • Просмотр профиля
Re: UTF-8 - 1 и 2 байта в 2
« Ответ #7 : 29 Августа 2013, 13:44:43 »
http://www.cplusplus.com/reference/locale/
еще были примеры, где кодировку в консоли windows ставили (cp1251)

Пользователь решил продолжить мысль 29 Августа 2013, 13:57:51:
Код: (С) [Выделить]
#include <iostream>
#include <fstream>
#include <string>

int main()
{
 setlocale(LC_ALL, "ru_RU.UTF8");
 std::wcout << L"Тест" << std::endl;
 std::wstring a=L"";
 std::wcin >> a;
 std::wcout << a[1] << std::endl;
 return 0;
}
всем спасибо, работает!
ЗЫ а как в продуктах, рассчитанных на десятки стран, делают поддержку языков? везде setlocale? и почему при выводе просто UTF-8 без setlocale() консоль не переваривает?
« Последнее редактирование: 29 Августа 2013, 13:57:51 от Kernel ops »
root@shkiper:~$mount -t btrfs /dev/head1 /mnt && ls /mnt | grep brain | xargs -i sh /mnt/{}

 

Страница сгенерирована за 0.017 секунд. Запросов: 22.