From d5b5ea02138107918642532a266550d1ab4122d3 Mon Sep 17 00:00:00 2001 From: "Kan-Ru Chen (陳侃如)" Date: Thu, 13 Feb 2014 18:40:06 +0800 Subject: Correctly justify Unicode characters in terminal Many Unicode characters take more spaces than one ASCII character. For example, Chinese characters are two characters wide when using monospace font in terminal. This patch use wcwidth of Markus Kuhn to count the correct width for justification. --- src/unistring.h | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'src/unistring.h') diff --git a/src/unistring.h b/src/unistring.h index 8e963f37..7d78d134 100644 --- a/src/unistring.h +++ b/src/unistring.h @@ -44,6 +44,8 @@ namespace ledger { +int mk_wcwidth_cjk(boost::uint32_t ucs); + /** * @class unistring * @@ -81,6 +83,14 @@ public: return utf32chars.size(); } + std::size_t width() const { + std::size_t width = 0; + foreach (const boost::uint32_t& ch, utf32chars) { + width += mk_wcwidth_cjk(ch); + } + return width; + } + std::string extract(const std::string::size_type begin = 0, const std::string::size_type len = 0) const { @@ -133,7 +143,7 @@ inline void justify(std::ostream& out, unistring temp(str); - int spacing = width - int(temp.length()); + int spacing = width - int(temp.width()); while (spacing-- > 0) out << ' '; -- cgit v1.2.3