Class: TECSIO

Inherits:
Object show all
Defined in:
lib/tecsgen/core/bnf.tab.rb,
lib/tecsgen/core/bnf-deb.tab.rb

Overview

TECSIO

Ruby2.0(1.9) 対応に伴い導入したクラス
SJIS 以外では、ASCII-8BIT として入力する

Class Method Summary collapse

Class Method Details

.foreach(file) ⇒ Object

ブロック引数 { |line| }



5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
# File 'lib/tecsgen/core/bnf.tab.rb', line 5148

def self.foreach(file) # ブロック引数 { |line| }
  pr = Proc.new   # このメソッドのブロック引数を pr に代入
  msg = "E".encode $Ruby19_File_Encode
  if( $Ruby19_File_Encode == "Shift_JIS" )

    # Shift JIS は、いったん Windows-31J として読み込ませ、Shift_JIS に変換させる.
    # コメント等に含まれる SJIS に不適切な文字コードは '?' または REPLACEMENT CHARACTER に変換される.
    # EUC や UTF-8 で記述された CDL が混在していても、Ruby 例外が発生することなく処理を進めることができる.
    # 文字コード指定が SJIS であって、文字列リテラルの中に、文字コードがSJIS 以外の非 ASCII が含まれている場合、
    # Ruby 1.8 の tecsgen では文字コード指定に影響なく処理されたものが、Ruby 1.9 以降では '?' に置き換わる可能性がある.

    mode = "r:Windows-31J"
  else
    mode = "r:#{$Ruby19_File_Encode}"
  end

  f = File.open( file, mode )
  begin
    f.each{ |line|
      # dbgPrint line
      line = str_code_convert( msg, line )
      pr.call( line )
    }
  ensure
    f.close
  end
end

.str_code_convert(msg, str) ⇒ Object

文字コードが相違する場合一致させる

msg と str の文字コードが相違する場合、str を msg の文字コードに変換する 変換不可の文字コードは ‘?’ (utf-8 の場合 U+FFFD (REPLACEMENT CHARACTER )) に変換

このメソッドは、エラーメッセージ出力でも使用されていることに注意.

msg_enc::Encode | String



5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
# File 'lib/tecsgen/core/bnf.tab.rb', line 5183

def self.str_code_convert( msg, str )
  if msg.encoding != str.encoding then
    option = { :invalid => :replace, :undef => :replace }   # 例外を発生させず、'?' に変換する(utf-8 は 0xfffd)
    # return str.encode( msg.encoding, option )
    str = str.encode( "utf-8", option )
    return str.encode( msg.encoding, option )
  else
    return str
  end
end