From: Masahiro Utsumi Date: 2007-08-02T17:28:14+09:00 Subject: [ruby-list:43797] Re: mod_ruby 環境の Rails での日本語文字列の truncate 内海@ベルギーです $KCODEをちゃんと設定されていますでしょうか? 私はtruncateではなく、送信メールの本文を整形する処理を 作ろうとして悩んでいます。文字数ではなく半角文字数換算で 折り返したいのです。 nkfの -f フラグを使えばできるのですが、nkfでは UTF8が 扱えないですし、文字列を "string".sizeってやると 全角文字は3バイトと数えられるみたいで、半角換算(=表示幅) とならないので悩んでいます。 UTF8でメール本文整形(折り返し)ができて、できれば、 「。」など文章の先頭に折り返されないような禁則処理もサポート したライブラリありませんでしょうか? 便乗質問失礼しました。 On 2007/08/02, at 9:56, IKEDA Katsumi wrote: > 池田と申します。 > > Ruby on Rails での日本語文字列を指定した長さだけ > 切り取る処理 (truncate) を実装しようとしています。 > > 環境は Debian etch で以下を使用しています。 > - ruby 1.8.5 (Debian 標準) > - apache 2.2.3 (Debian 標準) > - mod_ruby (Debian 標準 libapache2-mod-ruby) > - MySQL 5.0.x (独自ビルド) > - RubyGems (独自インストール) > > 最終目的は文字列を半角nバイト分取り出すことです。 > ここではいわゆる半角英数と全角があり、半角が全角の > 2倍の文字幅を持っているというイメージで考えています。 > > > 当初は独自実装で以下の形で一文字ずつ数えていき、 > Webrick 環境でテストした範囲では期待した動作を > していました。 > > ここで text は、MySQL から取り出した Rails の > モデルが保持している文字列です。 > > def my_truncate(text, length) > text.split(//).eatch do |c| > if c.length > 1 > # 全角 2 バイトのつもりで計算 > else > # 半角 1 バイトのつもりで計算 > end > end > end > > そして最近 mod_ruby 化を行ったところ、文字の切り出しが > 期待どおりに行われず、サーバの再起動の直後以外は指定した > 長さの半分の長さで切られているという現象が発生するように > なりました。切り取りが全角文字を分断した場合は、その部分が > 文字化けする状態となっています。 > > 全角2バイトとして処理されているように私は感じています。 > > text.split(//) で単なるバイト列としてすべて1バイトずつ > 処理されているのが原因ではないかと思っているのですが、 > 対応方法など検討が付かずに困っております。 > > 現在は rails の helper に標準で用意されている > truncate を使い、 > とりあえず文字数で切り取る方法を試しているのですが、 > こちらも同様に指定文字数よりも短く切り取られ、上記と同様に > 末尾にごみが付いている状態が発生しています。 > > > 本当に mod_ruby 化だけで問題が発生したのかあやふやな部分も > あるのですが、解決法や抑えておくべき情報などアドバイス > いただけますでしょうか。 > > よろしくお願いします。 > > -- > IKEDA Katsumi >