マルチバイト文字列用のルーチン使って文字を切り出すか、UTF-16をつかう。

おそらくstd::stringで1バイトづつ出力させてるんだろうけど、それやっちゃうと2バイト文字は半分ちぎれたりするから正常に表示できない。
ちゃんと2バイト文字は2バイトづつ出力させるか、2バイト固定のUTF-16使えばOK。
荒技としては逆に1バイト文字を使わないという手もある。(全角数字、全角アルファベット、全角記号で代用)