アプリ版:「スタンプのみでお礼する」機能のリリースについて

OS: Linux Ubuntu
言語: C++

引数でchar*型の文字列配列(マルチバイト含む)を受け取り
指定した幅で枠つきで文字列を出力したいのですがうまくいきません。

作りたい出力
━━━━━━━
┃1: あいうえお┃
┃2: かきく   ┃
┃3: abc    ┃
━━━━━━━

- str[] = {"あいうえお", "かきく", "abc"}
- あいうえおの後ろは空白なし
- 他は空白と文字列を合計してあいうえおと同じ長さに合うように

私の環境では日本語は3byteと認識され
 strlen("あいうえお") = 15
となります。
イメージでは
for (i = 0; i < strlen(str[])の最大値; i++) {
cout << "┃" << i << ":" << setw(15) << left << str[i] << "┃"
}
のようなコードになると思うのですが
日本語一文字が出力上は2byte分の幅に見えるのに
認識としては3byteになってしまうので空白が1byte多くなり

━━━━━━━
┃1: あいうえお┃
┃2: かきく    ┃
┃3: abc       ┃
━━━━━━━
のようにずれてしまいます。
(表記上、最初の枠もずれていますが
 現状は足りない分を埋めるsetfillが余計に働いてしまうということです。)

何か対策はありますでしょうか?

A 回答 (6件)

> Unicodeで作成していました。


> Shift-JISだと確かに2byteで問題なくできました。

ならばUTF-8だったのでしょう。
UTF-16なら全角/半角によらず2byteですし、strlenは誤動作しますから。

> ただ、フォントに依存しないような結果画面にしたいのですが
> 端末の文字コードをプログラム実行に強制変更などということはできますか?

フォントと文字コードは別物です。
Shift-JISに変換したのち長さを返す関数をひとつ用意すればいいかと。
    • good
    • 0

>意図としては結果画面が環境依存したくないということです。



環境依存にしたくないということであれば「等幅フォント」前提というのは環境依存ではないでしょうか。

>端末の文字コードをプログラム実行に強制変更などということはできますか?

できません。
    • good
    • 0
「マルチバイト混在の文字列整形」の回答画像4
    • good
    • 0

文字コードがEUC-JPかなにかかしら。


Shift-JISに変換すれば半角1byte/全角2byteになりますぜ。

この回答への補足

Unicodeで作成していました。
Shift-JISだと確かに2byteで問題なくできました。
ただ、フォントに依存しないような結果画面にしたいのですが
端末の文字コードをプログラム実行に強制変更などということはできますか?

補足日時:2012/05/06 16:52
    • good
    • 0

文字のバイト数と表示幅を関連づけて考えるのがそもそもの間違いです。


まともにするなら文字に対応するフォントの情報から表示幅を取得することになります。

フォントから情報を取得するような事はしたくない、ということであれば文字を引数に表示幅を返すサブルーチンを作成するのがよいかと思います。

この回答への補足

サブルーチンで日本語が3byteの場合は対応できました。

表示幅というのは表現が変かもしれませんが
意図としては結果画面が環境依存したくないということです。

補足日時:2012/05/06 16:51
    • good
    • 0

1バイト文字は1と数え、3バイト文字は2と数えると言うことであれば、自分でサブルーチンを作るしかないと思います。

    • good
    • 0
この回答へのお礼

サブルーチンでやる方法はできました。ありがとうございます。

お礼日時:2012/05/06 16:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!