From: IKEDA Katsumi Date: 2007-08-02T16:56:02+09:00 Subject: [ruby-list:43796] mod_ruby 環境の Rails での日本語文字列の truncate 池田と申します。 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