日本語と英語のまざる文字列をうまく折り返せません


アカツメクサ  2003-07-17 11:24:38  No: 51736  IP: [192.*.*.*]

1週間以上なやんでいます。
コンソールで、文字列を渡して、文字に枠を
●●●●●●●●●
●こんなかんじに●
●●●●●●●●●
つけるメンバ関数といったことをちょっと挑戦してるのですが、
1行が長すぎて おりかえしの処理で
どうやってもどこかに文字化けが入ってしまうのですが・・・。
1行の最後の文字が2バイト文字の先頭かどうかをしらべて、
それによってvectorに格納しておく長さを1バイト変えて切り取って格納
・・・という流れなのですが・・・。

typedef  std::string::size_type STR_SIZE;
const MAXSTR  = 76;
class stamp
{
       std::vector<std::string> vstr;
      ...............
};
void stamp::lineturn(const std::string & str)
{
  
  STR_SIZE i;
  STR_SIZE pos = 0;
  STR_SIZE row = str.length() / MAXSTR;
  STR_SIZE cut  = MAXSTR ;
  
  for(i = 0; i < row ;i++)
  {   
    

    if(_ismbblead( (int)str.at(pos + MAXSTR - 1) ) )
    {
      cut = MAXSTR - 1;
    }
    else
    {
      cut = MAXSTR ;
    }
    
    vstr.push_back( str.substr(pos,cut));  

    pos = pos + vstr.back().size();

  }  
  
  vstr.push_back( str.substr(pos,std::string::npos));

}

編集 削除
pbmplus  2003-07-17 16:50:15  No: 51737  IP: [192.*.*.*]

日本語を分断しているのではないかと思います。(2byte -> 1byte)
もしくは、文字の後部にNULLがないなどが考えられます。

編集 削除
アカツメクサ  2003-07-17 18:39:30  No: 51738  IP: [192.*.*.*]

ありがとうございます!
その方向で考えを進めていくことの確信になりました。

今までも分断させないようにしようとしてはいるのですが、
どこかなにかしらの考え違いがあるようで、

とくに、
・元の文字列[1文字目のポジション + 行の最大バイト数 - 1] 
  が、 その行の最後の1バイト 
・そこが2バイト文字の1バイト目だったら、
・1文字少なくしてとりだしてコピー 
・そして そのサイズだけポジションを足す・・・

としていますが、うまくいかず・・というところで考えがとどまっています。

std::stringですからNULLがつかないはずなのですが、
この日本語処理にはchar[]でなければならないかどうかも
それも含めて考えているのですが・・

編集 削除
fuku  2003-07-18 19:26:29  No: 51739  IP: [192.*.*.*]

はじめまして、fukuです。

日本語文字の文字コードには0x8181等の文字があるので、
日本語と英語が混在する場合、
文字列の最初から読んでいかなければ日本語第1バイトであるか分かりません。

文字化けの原因は行の最後にこのような文字があるからではないでしょうか?

編集 削除