Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
DiffEreD
 Аватар для DiffEreD
1425 / 762 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
#1

Как правильно можно узнать количество хранимых в строке символов? - C++

04.08.2014, 13:39. Просмотров 502. Ответов 13
Метки нет (Все метки)

Есть строка с юникод символами. Как правильно можно узнать количество хранимых в строке символов?
C++
1
2
3
4
5
6
7
8
9
int main()
{
   std::wifstream wifs("file.txt");
   std::wstring wstr;
   wifs >> wstr; // 5 юникод символов
   std::cout << "Size: " << wstr.size() << "\n"; //выводит 15
 
   return 0;
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.08.2014, 13:39     Как правильно можно узнать количество хранимых в строке символов?
Посмотрите здесь:

Посчитать количество символов в строке C++
Как в с/с++ можно подсчитать количество символов, обработанных в единицу времени C++
C++ Ограниченное количество символов в строке
Посчитать количество символов в строке C++
Количество символов в строке C++
C++ Найти количество символов всех строк файла и количество символов в определенной строке
Узнать, сколько символов в строке (вместе с пробелами) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4869 / 3008 / 370
Регистрация: 10.11.2010
Сообщений: 11,059
Записей в блоге: 10
Завершенные тесты: 1
04.08.2014, 14:09     Как правильно можно узнать количество хранимых в строке символов? #2
wstr.length() должна возвращать длину в символах, как и wstr.size().
DiffEreD
 Аватар для DiffEreD
1425 / 762 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
04.08.2014, 15:58  [ТС]     Как правильно можно узнать количество хранимых в строке символов? #3
Нет, выводит то же что и size().

Добавлено через 3 минуты
В строке находятся примерно такие каракули: ᴔᴕᴗᴭᴣ

Добавлено через 1 час 42 минуты
Разве что такие грабли писать:
C++
1
2
3
4
5
6
size_t utf8len(const wchar_t *s)
{
    size_t len = 0;
    for (; *s; ++s) if ((*s & 0xC0) != 0x80) ++len;
    return len;
}
CyberSolver
 Аватар для CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
04.08.2014, 16:05     Как правильно можно узнать количество хранимых в строке символов? #4
DiffEreD, входной файл прикрепить можете?
DiffEreD
 Аватар для DiffEreD
1425 / 762 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
04.08.2014, 16:07  [ТС]     Как правильно можно узнать количество хранимых в строке символов? #5
Да пожалуйста:
Вложения
Тип файла: txt file.txt (15 байт, 10 просмотров)
CyberSolver
 Аватар для CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
04.08.2014, 16:22     Как правильно можно узнать количество хранимых в строке символов? #6
DiffEreD, сообщение компилятора:
terminate called after throwing an instance of 'std::ios_base::failure'
what(): basic_filebuf::underflow invalid byte sequence in file

Может дело в кодировке входного файла? Сохранил как UTF-16 - выдал 10. Может у вас там utf-8?
DiffEreD
 Аватар для DiffEreD
1425 / 762 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
04.08.2014, 16:29  [ТС]     Как правильно можно узнать количество хранимых в строке символов? #7
У меня там UTF-8
CyberSolver
 Аватар для CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
04.08.2014, 16:46     Как правильно можно узнать количество хранимых в строке символов? #8
DiffEreD, тогда просто читайте как string. Потому что wstring - это по 2 байта.
DiffEreD
 Аватар для DiffEreD
1425 / 762 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
04.08.2014, 16:58  [ТС]     Как правильно можно узнать количество хранимых в строке символов? #9
Это сути не меняет. size() все равно не выведет количество символов. Надо писать свою функцию.
CyberSolver
 Аватар для CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
04.08.2014, 17:12     Как правильно можно узнать количество хранимых в строке символов? #10
DiffEreD, ну так а чего вы хотели? Кто вам сказал, что один символ равен 1 байту? UTF-8 же. Размер файла 15 байт, вас это не удивило?
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
04.08.2014, 17:22     Как правильно можно узнать количество хранимых в строке символов? #11
Цитата Сообщение от DiffEreD Посмотреть сообщение
Надо писать свою функцию.
Надо привести кодировку к UCS-2
zss
Модератор
Эксперт С++
 Аватар для zss
6112 / 5715 / 1849
Регистрация: 18.12.2011
Сообщений: 14,599
Завершенные тесты: 1
04.08.2014, 20:06     Как правильно можно узнать количество хранимых в строке символов? #12
В соседней теме Issues привел ссылку на такую функция для чтения utf-8 строк:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
size_t GetSizeOfFile(const std::wstring& path)
{
    struct _stat fileinfo;
    _wstat(path.c_str(), &fileinfo);
    return fileinfo.st_size;
}
 
std::wstring LoadUtf8FileToString(const std::wstring& filename)
{
    std::wstring buffer;            // stores file contents
    FILE* f = _wfopen(filename.c_str(), L"rtS, ccs=UTF-8");
 
    // Failed to open file
    if (f == NULL)
    {
        // ...handle some error...
        return buffer;
    }
 
    size_t filesize = GetSizeOfFile(filename);
 
    // Read entire file contents in to memory
    if (filesize > 0)
    {
        buffer.resize(filesize);
        size_t wchars_read = fread(&(buffer.front()), sizeof(wchar_t), filesize, f);
        buffer.resize(wchars_read);
        buffer.shrink_to_fit();
    }
 
    fclose(f);
 
    return buffer;
}
пример вызова
C++
1
std::wstring mytext = LoadUtf8FileToString(L"C:\\MyUtf8File.txt");
DrOffset
6817 / 4028 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
04.08.2014, 20:24     Как правильно можно узнать количество хранимых в строке символов? #13
Сообщение было отмечено автором темы, экспертом или модератором как ответ
DiffEreD, чтобы не писать велосипедов, вот.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.08.2014, 22:49     Как правильно можно узнать количество хранимых в строке символов?
Еще ссылки по теме:

Найти количество символов в строке, найти заданные буквы, разделить количество букв на количество символов C++
C++ Как узнать количество аргументов в команде/строке?
Как в строке удалить указанное количество символов, начиная с заданной позиции? C++
C++ Как найти количество символов в строке до определённого знака?
C++ Как увеличить максимальное количество символов, которое можно ввести в консоль?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
DiffEreD
 Аватар для DiffEreD
1425 / 762 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
04.08.2014, 22:49  [ТС]     Как правильно можно узнать количество хранимых в строке символов? #14
Короче, проблему решил через ICU. Пока остановлюсь на этом.
C++
1
2
icu::UnicodeString u_str = icu::UnicodeString::fromUTF8(wstr.c_str());
std::cout << "Length wstr is " << u_str.length();
Yandex
Объявления
04.08.2014, 22:49     Как правильно можно узнать количество хранимых в строке символов?
Ответ Создать тему
Опции темы

Текущее время: 17:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru