diff options
author | louiz’ <louiz@louiz.org> | 2016-06-15 12:19:19 +0200 |
---|---|---|
committer | louiz’ <louiz@louiz.org> | 2016-06-15 15:50:45 +0200 |
commit | 4b1c580bb9bc03d656e59d702c72c3e793a1bbe0 (patch) | |
tree | a0e6c78955d1a06f54d39f55f16d280cd8e80a21 /louloulibs | |
parent | 6235fb2d0326b18a9e013ae13dfb1fd0577ffd9f (diff) | |
download | biboumi-4b1c580bb9bc03d656e59d702c72c3e793a1bbe0.tar.gz biboumi-4b1c580bb9bc03d656e59d702c72c3e793a1bbe0.tar.bz2 biboumi-4b1c580bb9bc03d656e59d702c72c3e793a1bbe0.tar.xz biboumi-4b1c580bb9bc03d656e59d702c72c3e793a1bbe0.zip |
cut messages at 512 bytes, taking into account the UTF-8 codepoints
ref #3067
Diffstat (limited to 'louloulibs')
-rw-r--r-- | louloulibs/utils/string.cpp | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/louloulibs/utils/string.cpp b/louloulibs/utils/string.cpp index 7ed1aa3..2447f84 100644 --- a/louloulibs/utils/string.cpp +++ b/louloulibs/utils/string.cpp @@ -1,4 +1,5 @@ #include <utils/string.hpp> +#include <utils/encoding.hpp> bool to_bool(const std::string& val) { @@ -11,8 +12,17 @@ std::vector<std::string> cut(const std::string& val, const std::size_t size) std::string::size_type pos = 0; while (pos < val.size()) { - res.emplace_back(val.substr(pos, size)); - pos += size; + // Get the number of chars, <= size, that contain only whole + // UTF-8 codepoints. + std::size_t s = 0; + auto codepoint_size = utils::get_next_codepoint_size(val[pos + s]); + while (s + codepoint_size <= size) + { + s += codepoint_size; + codepoint_size = utils::get_next_codepoint_size(val[pos + s]); + } + res.emplace_back(val.substr(pos, s)); + pos += s; } return res; } |