/tools/Ruby/lib/ruby/1.8/rexml/encodings/ISO-8859-15.rb

http://github.com/agross/netopenspace · Ruby · 72 lines · 59 code · 2 blank · 11 comment · 1 complexity · 6f39e6f5ac0f1c7771d2e08d9a3a8dbb MD5 · raw file

  1. #
  2. # This class was contributed by Mikko Tiihonen mikko DOT tiihonen AT hut DOT fi
  3. #
  4. module REXML
  5. module Encoding
  6. register("ISO-8859-15") do |o|
  7. alias encode to_iso_8859_15
  8. alias decode from_iso_8859_15
  9. end
  10. # Convert from UTF-8
  11. def to_iso_8859_15(content)
  12. array_utf8 = content.unpack('U*')
  13. array_enc = []
  14. array_utf8.each do |num|
  15. case num
  16. # shortcut first bunch basic characters
  17. when 0..0xA3; array_enc << num
  18. # characters removed compared to iso-8859-1
  19. when 0xA4; array_enc << '&#164;'
  20. when 0xA6; array_enc << '&#166;'
  21. when 0xA8; array_enc << '&#168;'
  22. when 0xB4; array_enc << '&#180;'
  23. when 0xB8; array_enc << '&#184;'
  24. when 0xBC; array_enc << '&#188;'
  25. when 0xBD; array_enc << '&#189;'
  26. when 0xBE; array_enc << '&#190;'
  27. # characters added compared to iso-8859-1
  28. when 0x20AC; array_enc << 0xA4 # 0xe2 0x82 0xac
  29. when 0x0160; array_enc << 0xA6 # 0xc5 0xa0
  30. when 0x0161; array_enc << 0xA8 # 0xc5 0xa1
  31. when 0x017D; array_enc << 0xB4 # 0xc5 0xbd
  32. when 0x017E; array_enc << 0xB8 # 0xc5 0xbe
  33. when 0x0152; array_enc << 0xBC # 0xc5 0x92
  34. when 0x0153; array_enc << 0xBD # 0xc5 0x93
  35. when 0x0178; array_enc << 0xBE # 0xc5 0xb8
  36. else
  37. # all remaining basic characters can be used directly
  38. if num <= 0xFF
  39. array_enc << num
  40. else
  41. # Numeric entity (&#nnnn;); shard by Stefan Scholl
  42. array_enc.concat "&\##{num};".unpack('C*')
  43. end
  44. end
  45. end
  46. array_enc.pack('C*')
  47. end
  48. # Convert to UTF-8
  49. def from_iso_8859_15(str)
  50. array_latin9 = str.unpack('C*')
  51. array_enc = []
  52. array_latin9.each do |num|
  53. case num
  54. # characters that differ compared to iso-8859-1
  55. when 0xA4; array_enc << 0x20AC
  56. when 0xA6; array_enc << 0x0160
  57. when 0xA8; array_enc << 0x0161
  58. when 0xB4; array_enc << 0x017D
  59. when 0xB8; array_enc << 0x017E
  60. when 0xBC; array_enc << 0x0152
  61. when 0xBD; array_enc << 0x0153
  62. when 0xBE; array_enc << 0x0178
  63. else
  64. array_enc << num
  65. end
  66. end
  67. array_enc.pack('U*')
  68. end
  69. end
  70. end