Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.10.2017, 07:32   #1
polin11
Форумчанин
 
Регистрация: 07.06.2015
Сообщений: 164
По умолчанию простая функция substr для UTF-8

простая функция substr для UTF-8

Функция cutString делает срез строки в формате UTF-8 от 0 до len.
Код:
#include <iostream>
#include <codecvt>
#include <string>
#include <locale>

std::string cutString(const std::string& in, size_t len)
{
    std::wstring_convert<std::codecvt_utf8<wchar_t>> cvt;
    auto wstring = cvt.from_bytes(in);
    if(len < wstring.length())
    {
        wstring = wstring.substr(0,len);
        return cvt.to_bytes(wstring);
    }    
    return in;
}
int main(){
    std::string test = "\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xb8\x96\xe7\x95\x8c"; //你好世界 length 4
    std::cout << test << '\n' << cutString(test,2) << '\n';
    return 0;
}
Понятно, что UTF-8 (переменное количество байт), обынчые функции size, substr работают некорректно.

1) Помогите разобраться, что делают строки
Код:
std::wstring_convert<std::codecvt_utf8<wchar_t>> cvt;
auto res = cvt.from_bytes(in);
wstring = wstring.substr(0,len);
return cvt.to_bytes(res);
правильно ли я понимаю преобразуют в тип с постоянным количеством байт,
затем делает срез строки, преобразует его обратно UTF-8???


2) Кажется условие if(len < wstring.length())
(количество символов в подстроке должно быть меньше символов в самой строке) избыточно,
без него исключение не возникаем, выдает все строку целиком???
polin11 вне форума Ответить с цитированием
Старый 22.10.2017, 14:08   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от polin11 Посмотреть сообщение
правильно ли я понимаю
Правильно
Цитата:
Сообщение от polin11 Посмотреть сообщение
без него исключение не возникаем, выдает все строку целиком
Да
Black Fregat вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция substr - косяк spirit-ua PHP 3 01.06.2016 17:22
Реально ли перевести UTF-16 в UTF-8, если да то как? FleXik Общие вопросы Delphi 7 28.09.2014 12:11
С#: Простая функция для записи данных в sqlite _Energy Фриланс 0 10.05.2014 00:28
Простая арифметическая функция выдает неверное значение delphi Inqui Помощь студентам 0 26.05.2010 14:28
UTF-8 в Windows-1251 - нужна функция motorway PHP 3 04.07.2009 15:28