File: iconv.rb

package info (click to toggle)
libgettext-ruby 1.7.0-1
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 3,892 kB
  • ctags: 1,198
  • sloc: ruby: 6,738; ansic: 67; makefile: 38; sql: 14; sh: 6
file content (95 lines) | stat: -rw-r--r-- 2,862 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
=begin
  iconv.rb - Pseudo Iconv module

  If you don't have iconv but glib2, this library behaves
  as Iconv.iconv.

  Copyright (C) 2004  Masao Mutoh <mutoh@highway.ne.jp>

  You may redistribute it and/or modify it under the same
  license terms as Ruby.

  $Id: iconv.rb,v 1.3 2006/06/11 15:36:20 mutoh Exp $
=end

begin
  require 'iconv.so'
rescue LoadError
  begin
    require 'glib2'
    # Pseudo Iconv module
    # 
    # Provides Iconv.iconv which uses Ruby/GLib(1) functions. This library also required from 'gettext'.
    # If you require 'gettext/iconv', Iconv.iconv try to call Ruby/GLib function 
    # when it doesn't find original Iconv module(iconv.so).
    #
    # (1) Ruby/GLib is a module which is provided from Ruby-GNOME2 Project. 
    # You can get binaries for Win32(One-Click Ruby Installer).
    # <URL: http://ruby-gnome2.sourceforge.jp/>
    module Iconv
      module Failure; end
      class InvalidEncoding < ArgumentError;  include Failure; end
      class IllegalSequence < ArgumentError;  include Failure; end
      class InvalidCharacter < ArgumentError; include Failure; end

      def check_glib_version?(major, minor, micro) # :nodoc:
        (GLib::BINDING_VERSION[0] > major ||
         (GLib::BINDING_VERSION[0] == major && 
          GLib::BINDING_VERSION[1] > minor) ||
         (GLib::BINDING_VERSION[0] == major && 
          GLib::BINDING_VERSION[1] == minor &&
          GLib::BINDING_VERSION[2] >= micro))
      end
      module_function :check_glib_version?

      if check_glib_version?(0, 11, 0)
	# This is a function equivalent of Iconv.iconv.
	# * to: encoding name for destination
	# * from: encoding name for source
	# * str: strings to be converted
	# * Returns: Returns an Array of converted strings.
        def iconv(to, from, str)
          begin
            GLib.convert(str, to, from).split(//)
          rescue GLib::ConvertError => e
            case e.code
            when GLib::ConvertError::NO_CONVERSION
              raise InvalidEncoding.new(str)
            when GLib::ConvertError::ILLEGAL_SEQUENCE
              raise IllegalSequence.new(str)
            else
              raise InvalidCharacter.new(str)
            end
          end
        end
      else
       def iconv(to, from, str) # :nodoc:
         begin
           GLib.convert(str, to, from).split(//)
         rescue
           raise IllegalSequence.new(str)
         end
       end
      end
      module_function :iconv
    end
  rescue LoadError
    module Iconv
      module_function
      def iconv(to, from, str) # :nodoc:
        warn "Iconv was not found." if $DEBUG
        str.split(//)
      end
    end
  end
end

if __FILE__ == $0
  puts Iconv.iconv("EUC-JP", "UTF-8", "ほげ").join
  begin
    puts Iconv.iconv("EUC-JP", "EUC-JP", "ほげ").join
  rescue Iconv::Failure
    puts $!
    puts $!.class
  end
end