NUMATA Toshinori
numat****@jp*****
2005年 8月 8日 (月) 17:24:18 JST
沼田です. TAKAHASHI Tamotsu wrote: > さて、そのうえで > バッファが正しく終了していることを保証するには > * やはり最初から mbrtowc で見ていくべき > * 最後のほうから mbrtowc しても大丈夫 > どちらなのでしょうか。 最後から見るというのは,たとえば,文字列の最後から MB_CUR_MAX バイトぶ んのバイトについて,mbrtowc() が正常に動作するか調べる,駄目なら1バイト 次に進んで同じことを繰り返す……みたいなことを考えていますか. 最後から検索しても確実に文字の最初のバイトを見つけられるのは UTF-8 く らいのもので,それ以外の文字エンコーディングで成功するとは限りません. また,不完全な (尻切れの) バイト列を見つけたのか,それとも文字区切りを 間違えたのかの判別が面倒だと思います. 最初から見ていく方が確実でしょう. > また、mbrtowc には必ず自前の mbstate を > 用意しないといけないのでしょうか。 関数が用意している内部の mbstate_t オブジェクトを使うことは,次の点で 問題があると思います. ・他の誰かが使わないことをどう保証するか. ・内部の mbstate_t オブジェクトを初期状態に戻す方法がわからない. なんとなく mbrtowc(NULL, "", 1, NULL) で初期状態に戻りそうな気がする けれど,「mbstate_t オブジェクトを初期状態に戻すには,memset() を使っ て mbstate_t オブジェクトの全バイトを 0 にしろ」などという解説がついて いたりするのが困る. -- 富士通(株) ソフトウェア事業本部 開発企画統括部 沼田 利典 (numa****@sysra*****)