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

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

Восстановить пароль Регистрация
 
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
04.08.2014, 13:39     Как правильно можно узнать количество хранимых в строке символов? #1
Есть строка с юникод символами. Как правильно можно узнать количество хранимых в строке символов?
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)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4844 / 2983 / 367
Регистрация: 10.11.2010
Сообщений: 11,016
Записей в блоге: 10
Завершенные тесты: 1
04.08.2014, 14:09     Как правильно можно узнать количество хранимых в строке символов? #2
wstr.length() должна возвращать длину в символах, как и wstr.size().
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 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
1420 / 757 / 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
1420 / 757 / 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
1420 / 757 / 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
5946 / 5551 / 1784
Регистрация: 18.12.2011
Сообщений: 14,178
Завершенные тесты: 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
6429 / 3803 / 882
Регистрация: 30.01.2014
Сообщений: 6,602
04.08.2014, 20:24     Как правильно можно узнать количество хранимых в строке символов? #13
Сообщение было отмечено автором темы, экспертом или модератором как ответ
DiffEreD, чтобы не писать велосипедов, вот.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.08.2014, 22:49     Как правильно можно узнать количество хранимых в строке символов?
Еще ссылки по теме:

Количество символов в строке C++
C++ Найти количество символов всех строк файла и количество символов в определенной строке
Узнать, сколько символов в строке (вместе с пробелами) C++

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

Или воспользуйтесь поиском по форуму:
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 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     Как правильно можно узнать количество хранимых в строке символов?
Ответ Создать тему
Опции темы

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