[前][次][番号順一覧][スレッド一覧]

ruby-reference-manual:549

From: Kouhei Sutou <kou@c...>
Date: Sun, 04 Nov 2007 22:14:13 +0900 (JST)
Subject: [ruby-reference-manual:549] Re: UTF-8な端末でも文字化けせずに出力する

須藤です。

In <C2FA9E85-2F5E-48AB-8066-9554A7141455@l...>
  "[ruby-reference-manual:547] Re: UTF-8な端末でも文字化けせずに出力する" on Sun, 4 Nov 2007 21:47:52 +0900,
  Minero Aoki <aamine@l...> wrote:

> > 端末のエンコーディングがEUC-JP以外の場合、refeの出 
> > 力が文字化
> > けしてしまいます。
> >
> > やっつけですが、出力される内容をLANGに指定されているエン 
> > コー
> > ディングに変換するパッチです。
> 
> 方向性はこれでよいと思うのですが、iconv じゃなくて  
> NKF に
> しませんか。iconv はかなりプラットフォーム依存が激しいので、
> たぶんすごく面倒くさいと思います。
> 
> NKF にしてもらったらコミットしてしまって構いません。

NKFにしてみました。


Index: lib/bitclust/searcher.rb
===================================================================
--- lib/bitclust/searcher.rb	(リビジョン 2242)
+++ lib/bitclust/searcher.rb	(作業コピー)
@@ -14,6 +14,7 @@
 require 'uri'
 require 'rbconfig'
 require 'optparse'
+require 'nkf'
 
 module BitClust
 
@@ -140,7 +141,9 @@
     end
 
     def new_database
-      Database.connect(@dblocation || dblocation())
+      db = Database.connect(@dblocation || dblocation())
+      @view.database = db if @view
+      db
     end
 
     def dblocation_name
@@ -284,10 +287,12 @@
 
   class TerminalView
 
+    attr_accessor :database
     def initialize(compiler, opts)
       @compiler = compiler
       @describe_all = opts[:describe_all]
       @line = opts[:line]
+      @database = nil
     end
 
     def show_class(cs)
@@ -395,6 +400,47 @@
       puts
     end
 
+    def puts(*args)
+      super(*args.collect {|arg| convert(arg)})
+    end
+
+    def convert(string)
+      return string if @database.nil?
+      _output_encoding = output_encoding
+      return string if _output_encoding.nil?
+      input_nkf_option = encoding_to_nkf_option(@database.encoding)
+      output_nkf_option = encoding_to_nkf_option(_output_encoding)
+      if input_nkf_option and output_nkf_option
+        NKF.nkf("-#{input_nkf_option.upcase}#{output_nkf_option}", string)
+      else
+        string
+      end
+    end
+
+    def output_encoding
+      locale = ENV["LC_ALL"] || ENV["LC_MESSAGE"] || ENV["LANG"]
+      case locale
+      when /\.([a-z\d\-]+)\z/i
+        $1
+      else
+        nil
+      end
+    end
+
+    def encoding_to_nkf_option(encoding)
+      return nil if encoding.nil?
+      case encoding
+      when /\A(?:euc[-_]?jp|ujis)\z/i
+        "e"
+      when /\Autf[-_]?8\z/i
+        "w"
+      when /\As(?:hift[-_]?)?jis\z/i
+        "s"
+      when /\Aiso-2022-jp\z/i
+        "j"
+      else
+        nil
+      end
+    end
   end
-
 end


--
ML: ruby-reference-manual@m...
使い方: http://QuickML.com/

[前][次][番号順一覧][スレッド一覧]

       534 2007-10-28 16:36 [kou@c...            ] UTF-8な端末でも文字化けせずに出力する   
       547 2007-11-04 13:47 ┗[aamine@l...         ]                                       
->     549 2007-11-04 14:14  ┗[kou@c...            ]