def initialize(lang)
set_language_if_valid lang
pdf_encoding = l(:general_pdf_encoding).upcase
- if RUBY_VERSION < '1.9'
- @ic = Iconv.new(pdf_encoding, 'UTF-8')
- end
super('P', 'mm', 'A4', (pdf_encoding == 'UTF-8'), pdf_encoding)
case current_language.to_s.downcase
when 'vi'
end
def fix_text_encoding(txt)
- RDMPdfEncoding::rdm_pdf_iconv(@ic, txt)
+ RDMPdfEncoding::rdm_from_utf8(txt, l(:general_pdf_encoding))
end
def RDMCell(w ,h=0, txt='', border=0, ln=0, align='', fill=0, link='')
class RDMPdfEncoding
include Redmine::I18n
- def self.rdm_pdf_iconv(ic, txt)
+ def self.rdm_from_utf8(txt, encoding)
txt ||= ''
+ txt = Redmine::CodesetUtil.from_utf8(txt, encoding)
if txt.respond_to?(:force_encoding)
- txt.force_encoding('UTF-8')
- if l(:general_pdf_encoding).upcase != 'UTF-8'
- txt = txt.encode(l(:general_pdf_encoding), :invalid => :replace,
- :undef => :replace, :replace => '?')
- else
- txt = Redmine::CodesetUtil.replace_invalid_utf8(txt)
- end
txt.force_encoding('ASCII-8BIT')
- elsif RUBY_PLATFORM == 'java'
- begin
- ic ||= Iconv.new(l(:general_pdf_encoding), 'UTF-8')
- txt = ic.iconv(txt)
- rescue
- txt = txt.gsub(%r{[^\r\n\t\x20-\x7e]}, '?')
- end
- else
- ic ||= Iconv.new(l(:general_pdf_encoding), 'UTF-8')
- txtar = ""
- begin
- txtar += ic.iconv(txt)
- rescue Iconv::IllegalSequence
- txtar += $!.success
- txt = '?' + $!.failed[1,$!.failed.length]
- retry
- rescue
- txtar += $!.success
- end
- txt = txtar
end
txt
end
require 'iconv'
class PdfTest < ActiveSupport::TestCase
- include Redmine::I18n
def test_fix_text_encoding_nil
- set_language_if_valid 'ja'
- assert_equal 'CP932', l(:general_pdf_encoding)
- if RUBY_VERSION < '1.9'
- if RUBY_PLATFORM == 'java'
- ic = Iconv.new("SJIS", 'UTF-8')
- else
- ic = Iconv.new(l(:general_pdf_encoding), 'UTF-8')
- end
- end
- assert_equal '', Redmine::Export::PDF::RDMPdfEncoding::rdm_pdf_iconv(ic, nil)
+ assert_equal '', Redmine::Export::PDF::RDMPdfEncoding::rdm_from_utf8(nil, "UTF-8")
+ assert_equal '', Redmine::Export::PDF::RDMPdfEncoding::rdm_from_utf8(nil, "ISO-8859-1")
end
def test_rdm_pdf_iconv_cannot_convert_ja_cp932
- set_language_if_valid 'ja'
- assert_equal 'CP932', l(:general_pdf_encoding)
- if RUBY_VERSION < '1.9'
- if RUBY_PLATFORM == 'java'
- ic = Iconv.new("SJIS", 'UTF-8')
- else
- ic = Iconv.new(l(:general_pdf_encoding), 'UTF-8')
- end
- end
+ encoding = ( RUBY_PLATFORM == 'java' ? "SJIS" : "CP932" )
utf8_txt_1 = "\xe7\x8b\x80\xe6\x85\x8b"
utf8_txt_2 = "\xe7\x8b\x80\xe6\x85\x8b\xe7\x8b\x80"
utf8_txt_3 = "\xe7\x8b\x80\xe7\x8b\x80\xe6\x85\x8b\xe7\x8b\x80"
if utf8_txt_1.respond_to?(:force_encoding)
- txt_1 = Redmine::Export::PDF::RDMPdfEncoding::rdm_pdf_iconv(ic, utf8_txt_1)
- txt_2 = Redmine::Export::PDF::RDMPdfEncoding::rdm_pdf_iconv(ic, utf8_txt_2)
- txt_3 = Redmine::Export::PDF::RDMPdfEncoding::rdm_pdf_iconv(ic, utf8_txt_3)
+ txt_1 = Redmine::Export::PDF::RDMPdfEncoding::rdm_from_utf8(utf8_txt_1, encoding)
+ txt_2 = Redmine::Export::PDF::RDMPdfEncoding::rdm_from_utf8(utf8_txt_2, encoding)
+ txt_3 = Redmine::Export::PDF::RDMPdfEncoding::rdm_from_utf8(utf8_txt_3, encoding)
assert_equal "?\x91\xd4", txt_1
assert_equal "?\x91\xd4?", txt_2
assert_equal "??\x91\xd4?", txt_3
assert_equal "ASCII-8BIT", txt_3.encoding.to_s
elsif RUBY_PLATFORM == 'java'
assert_equal "??",
- Redmine::Export::PDF::RDMPdfEncoding::rdm_pdf_iconv(ic, utf8_txt_1)
+ Redmine::Export::PDF::RDMPdfEncoding::rdm_from_utf8(utf8_txt_1, encoding)
assert_equal "???",
- Redmine::Export::PDF::RDMPdfEncoding::rdm_pdf_iconv(ic, utf8_txt_2)
+ Redmine::Export::PDF::RDMPdfEncoding::rdm_from_utf8(utf8_txt_2, encoding)
assert_equal "????",
- Redmine::Export::PDF::RDMPdfEncoding::rdm_pdf_iconv(ic, utf8_txt_3)
+ Redmine::Export::PDF::RDMPdfEncoding::rdm_from_utf8(utf8_txt_3, encoding)
else
assert_equal "???\x91\xd4",
- Redmine::Export::PDF::RDMPdfEncoding::rdm_pdf_iconv(ic, utf8_txt_1)
+ Redmine::Export::PDF::RDMPdfEncoding::rdm_from_utf8(utf8_txt_1, encoding)
assert_equal "???\x91\xd4???",
- Redmine::Export::PDF::RDMPdfEncoding::rdm_pdf_iconv(ic, utf8_txt_2)
+ Redmine::Export::PDF::RDMPdfEncoding::rdm_from_utf8(utf8_txt_2, encoding)
assert_equal "??????\x91\xd4???",
- Redmine::Export::PDF::RDMPdfEncoding::rdm_pdf_iconv(ic, utf8_txt_3)
+ Redmine::Export::PDF::RDMPdfEncoding::rdm_from_utf8(utf8_txt_3, encoding)
end
end
def test_rdm_pdf_iconv_invalid_utf8_should_be_replaced_en
- set_language_if_valid 'en'
- assert_equal 'UTF-8', l(:general_pdf_encoding)
str1 = "Texte encod\xe9 en ISO-8859-1"
str2 = "\xe9a\xe9b\xe9c\xe9d\xe9e test"
str1.force_encoding("UTF-8") if str1.respond_to?(:force_encoding)
str2.force_encoding("ASCII-8BIT") if str2.respond_to?(:force_encoding)
- if RUBY_VERSION < '1.9'
- ic = Iconv.new(l(:general_pdf_encoding), 'UTF-8')
- end
- txt_1 = Redmine::Export::PDF::RDMPdfEncoding::rdm_pdf_iconv(ic, str1)
- txt_2 = Redmine::Export::PDF::RDMPdfEncoding::rdm_pdf_iconv(ic, str2)
+ txt_1 = Redmine::Export::PDF::RDMPdfEncoding::rdm_from_utf8(str1, 'UTF-8')
+ txt_2 = Redmine::Export::PDF::RDMPdfEncoding::rdm_from_utf8(str2, 'UTF-8')
if txt_1.respond_to?(:force_encoding)
assert_equal "ASCII-8BIT", txt_1.encoding.to_s
assert_equal "ASCII-8BIT", txt_2.encoding.to_s
end
def test_rdm_pdf_iconv_invalid_utf8_should_be_replaced_ja
- set_language_if_valid 'ja'
- assert_equal 'CP932', l(:general_pdf_encoding)
str1 = "Texte encod\xe9 en ISO-8859-1"
str2 = "\xe9a\xe9b\xe9c\xe9d\xe9e test"
str1.force_encoding("UTF-8") if str1.respond_to?(:force_encoding)
str2.force_encoding("ASCII-8BIT") if str2.respond_to?(:force_encoding)
- if RUBY_VERSION < '1.9'
- if RUBY_PLATFORM == 'java'
- ic = Iconv.new("SJIS", 'UTF-8')
- else
- ic = Iconv.new(l(:general_pdf_encoding), 'UTF-8')
- end
- end
- txt_1 = Redmine::Export::PDF::RDMPdfEncoding::rdm_pdf_iconv(ic, str1)
- txt_2 = Redmine::Export::PDF::RDMPdfEncoding::rdm_pdf_iconv(ic, str2)
+ encoding = ( RUBY_PLATFORM == 'java' ? "SJIS" : "CP932" )
+ txt_1 = Redmine::Export::PDF::RDMPdfEncoding::rdm_from_utf8(str1, encoding)
+ txt_2 = Redmine::Export::PDF::RDMPdfEncoding::rdm_from_utf8(str2, encoding)
if txt_1.respond_to?(:force_encoding)
assert_equal "ASCII-8BIT", txt_1.encoding.to_s
assert_equal "ASCII-8BIT", txt_2.encoding.to_s