[ruby-list:46410] 再送;;ruby1.8.7と1.9.2の文字処理について

View: New views
6 Messages — Rating Filter:   Alert me  

[ruby-list:46410] 再送;;ruby1.8.7と1.9.2の文字処理について

by 前川 映一 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


昨日(9/24)発信しましたが、サーバからの返信がなかったので、再送しま
す。


前川です。
Windows版Rubyの1.8.7と1.9.2での違いについて、教えてください。

1.8.7では、エラー発生しませんが、1.9.2(1.9系共通??)では、
エラーとなります。

どうすれば、1.9.2でのエラーが解消できるでしょうか

コーディングは、以下です。

 1 #!D:/Ruby/bin/ruby.exe -Ks
 2
 3 require 'kconv'
 4 require 'nkf'
 5 require 'D:/Apache2.2/htdocs/ruby_prg/ruby19check/myclass' #MyClass 変換
メソッド等
 6
 7 # 試験データ
 8 # 文字→HEXへ変換するためのデータ
 9
10 data1 = '船海システムG' # 26バイトの '91448a43835683588365838047'に変換
する
11 data2 = 'TEST' # 8バイトの '54455354'に変換する
12 data3 ='船'
13 data4 ='kaisya会社123重厚重工業・・あaア  /\¥'  #←エラー1
14 data5 ='kaisya会社123重厚重工業あaイ  '            #←エラー2
15 data6 ='会社'
16 data7 = 'C:/Apache2.2/htdocs/qmsPotalShip/confirmation/sjisコード表
textConversion用.html'
17 data8 = "12_FBSYS_不具合情報入力-所内工事(速報) 23船証第三確認者の確認画
面03:コメント記入前:船証.png"
    〜以下略


デバッグ実行結果
バージョンの確認
D:\Apache2.2\htdocs\ruby_prg\ruby19check>ruby -v
ruby 1.9.2dev (2009-07-18) [i386-mswin32]

デバッグ実行(デバッガ使用)
D:\Apache2.2\htdocs\ruby_prg\ruby19check>ruby -r debug myclassTextTest.rb
Debug.rb
Emacs support available.

myclassTextTest.rb:13: invalid multibyte char (Windows-31J)   #←エラー1 全
角・半角が含まれているため??エラー
myclassTextTest.rb:14: syntax error, unexpected tIDENTIFIER, expecting $end
#←エラー2 行の終わりの文字が、全角の空白だから???
data5 ='kaisya会社123重厚重工業あaイ  '

となり、実行までには至っていません。
よろしくお願いします。

ちなみに、WINDOWS版は、
http://ftp.ruby-lang.org/pub/ruby/binaries/mswin32/
から、ダウンロードしています。





[ruby-list:46413] Re: 再送;;ruby1.8.7と1.9.2の文字処理について

by rubikitch :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

From: eiichi_maekawa@...
Subject: [ruby-list:46410] 再送;;ruby1.8.7と1.9.2の文字処理について
Date: Fri, 25 Sep 2009 07:39:56 +0900

るびきちです。

> myclassTextTest.rb:13: invalid multibyte char (Windows-31J)   #←エラー1 全
> 角・半角が含まれているため??エラー
> myclassTextTest.rb:14: syntax error, unexpected tIDENTIFIER, expecting $end
> #←エラー2 行の終わりの文字が、全角の空白だから???
> data5 ='kaisya会社123重厚重工業あaイ  '

2行目に
# -*- coding: windows-31j -*-
と入れてみましょう。

Ruby 1.9系ではスクリプトエンコーディングを表すmagic commentが「必須」となります。

--
rubikitch
Blog: http://d.hatena.ne.jp/rubikitch/
Site: http://www.rubyist.net/~rubikitch/
Twit: http://twitter.com/rubikitch/
『Ruby逆引きハンドブック』 http://d.hatena.ne.jp/rubikitch/20090525/rubybook


[ruby-list:46414] エラーでした;Re: Re: 再送;;ruby1.8.7と1.9.2の文字処理について

by 前川 映一 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

前川です。

るびきちさん 結果は、以下でした。

1.コーディング

#!D:/Ruby/bin/ruby.exe
# -*- coding: windows-31j -*-
require 'kconv'
require 'nkf'
require 'D:/Apache2.2/htdocs/ruby_prg/ruby19check/myclass' #MyClass 変換メ
ソッド等

# 試験データ
# 文字→HEXへ変換するためのデータ

data1 = '船海システムG' # 26バイトの '91448a43835683588365838047'に変換する
data2 = 'TEST' # 8バイトの '54455354'に変換する
data3 ='船'
data4 ='kaisya会社123重厚重工業・・あaア  /\¥'
data5 ='kaisya会社123重厚重工業あaイ  '
〜以下略〜

2.結果

D:/Apache2.2/htdocs/ruby_prg/ruby19check/myclassTextTest.rb:13: invalid
multibyte char (Windows-31J)
D:/Apache2.2/htdocs/ruby_prg/ruby19check/myclassTextTest.rb:14: syntax
error, unexpected tIDENTIFIER, expecting $end
data5 ='kaisya会社123重厚重工業あaイ  '
                                   ^
Complete(1)

何が、まずかったのでしょうか。
Rubyは、1.9.1p129 です。
Ruby1.9.2devでも、同様のエラーが出ました。


rubikitch@... wrote on 2009/09/25 13:07:06:

> From: eiichi_maekawa@...
> Subject: [ruby-list:46410] 再送;;ruby1.8.7と1.9.2の文字処理について
> Date: Fri, 25 Sep 2009 07:39:56 +0900

> るびきちです。

> > myclassTextTest.rb:13: invalid multibyte char (Windows-31J)   #←エラー
1 全
> > 角・半角が含まれているため??エラー
> > myclassTextTest.rb:14: syntax error, unexpected tIDENTIFIER, expecting
$end
> > #←エラー2 行の終わりの文字が、全角の空白だから???
> > data5 ='kaisya会社123重厚重工業あaイ  '

> 2行目に
> # -*- coding: windows-31j -*-
> と入れてみましょう。

> Ruby 1.9系ではスクリプトエンコーディングを表すmagic commentが「必須」
> となります。



[ruby-list:46415] Re: エラーでした;Re: Re: 再送;;ruby1.8.7と1.9.2の文字処理について

by Masayoshi Takahashi :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

高橋征義です。

2009年9月25日19:04  <eiichi_maekawa@...>:

> るびきちさん 結果は、以下でした。
>
> 1.コーディング
>
> #!D:/Ruby/bin/ruby.exe
> # -*- coding: windows-31j -*-
> require 'kconv'
> require 'nkf'
> require 'D:/Apache2.2/htdocs/ruby_prg/ruby19check/myclass' #MyClass 変換メ
> ソッド等
>
> # 試験データ
> # 文字→HEXへ変換するためのデータ
>
> data1 = '船海システムG' # 26バイトの '91448a43835683588365838047'に変換する
> data2 = 'TEST' # 8バイトの '54455354'に変換する
> data3 ='船'
> data4 ='kaisya会社123重厚重工業・・あaア /\¥'
> data5 ='kaisya会社123重厚重工業あaイ '
> 〜以下略〜

気になったので確認してみました。
Ruby 1.9では、マルチバイト文字を「\」でエスケープ?しようと
した文字列、例えば '\あ' みたいな文字列リテラルは
「invalid multibyte char」のエラーが発生することがあるようです。

  C:\Users\takahashi\Desktop>cat test2.rb
  # -*- coding: windows-31j -*-
  str = '\あ'

  C:\Users\takahashi\Desktop>ruby -v test2.rb
  ruby 1.9.1p243 (2009-07-16 revision 24175) [i386-mswin32]
  test2.rb:2: invalid multibyte char (Windows-31J)
  test2.rb:2: unterminated string meets end of file


とはいえ、前川さんが意図していたdata4は上記のプログラムでの実装とは
異なるのではないでしょうか。実は「あaア /\¥」ではなく「あaア /\\¥」
または「あaア /¥」が正しかったりはしないですか? であれば
これを修正していただくのが確実です。

という前川さんの問題とは別に、このような文字列リテラルの挙動は
エラーで正しいのでしょうかね。ASCII文字では問題なさそうですし。
本来はどういう扱いであるべきなのでしょうか?

高橋征義 (maki@...)


[ruby-list:46416] Re: エラーでした;Re: Re: 再送;;ruby1.8.7と1.9.2の文字処理について

by U.Nakamura :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

こんにちは、なかむら(う)です。

In message "[ruby-list:46415] Re: エラーでした;Re: Re:  再送;;ruby1.8.7と1.9.2の文字処理について"
    on Sep.25,2009 20:16:21, <maki@...> wrote:
> という前川さんの問題とは別に、このような文字列リテラルの挙動は
> エラーで正しいのでしょうかね。ASCII文字では問題なさそうですし。
> 本来はどういう扱いであるべきなのでしょうか?

バグでしょう。

Index: parse.y
===================================================================
--- parse.y (revision 25091)
+++ parse.y (working copy)
@@ -5737,6 +5737,8 @@ parser_tokadd_string(struct parser_param
  }
  else if (c != term && !(paren && c == paren)) {
     tokadd('\\');
+    pushback(c);
+    continue;
  }
     }
  }

それでは。
--
U.Nakamura <usa@...>



[ruby-list:46419] ;Re: Re: エラーでした;Re: Re: 再送;;ruby1.8.7と1.9.2の文字処理について

by 前川 映一 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

前川です。

なかむら(う)さん、高橋さん ありがとうございます。

実施したいのは、そのまま、変換することです。
(エスケープシケンスの\は、仕方ありませんが・・・)
(\\は、\にしかできませんが)

本体;;
#!D:/Ruby/bin/ruby.exe

#require 'kconv'
#require 'nkf'
require 'D:/Apache2.2/htdocs/qmsPotalShip/myclass' #MyClass 変換メソッド等

# 試験データ
# 文字→HEXへ変換するためのデータ

data1 = '船海システムG' # 26バイトの '91448a43835683588365838047'に変換する
data2 = 'TEST' # 8バイトの '54455354'に変換する
data3 ='船'
data4 ='kaisya会社123重厚重工業・・あaア  /\¥'
data5 ='kaisya会社123重厚重工業あaイ  '
data6 ='会社'
data7 = 'C:/Apache2.2/htdocs/qmsPotalShip/confirmation/sjisコード表
textConversion用.html'
data8 = "12_FBSYS_不具合情報入力-所内工事(速報) 23船証第三確認者の確認画面
03:コメント記入前:船証.png"
puts '文字からHEXへ変換'

puts data1 + " → " + MyClassText.text_to_hex(data1)
puts data2 + " → " + MyClassText.text_to_hex(data2)
puts data3 + " → " + MyClassText.text_to_hex(data3)
puts data4 + " → " + MyClassText.text_to_hex(data4)
puts data5 + " → " + MyClassText.text_to_hex(data5)
〜以下略


MyClassText.text_to_hex(data?)は、以下

##!C:/Ruby/bin/ruby.exe -Ks

print "Content-Type: text/html\n\n"

require 'kconv' # Stringの日本語関連メソッド
require 'nkf' # 漢字関係 Network Kanji code conversion Filter version 1.7
require 'cgi' # CGI プログラムの支援ライブラリ
require 'mysql' #MySQLライブラリ
#require "rubygems" # ライブラリ管理ツール
#require "dbi"


CODES = {
  NKF::JIS      => "JIS",
  NKF::EUC      => "EUC",
  NKF::SJIS     => "SJIS",
  NKF::BINARY   => "BINARY",
  NKF::UNKNOWN  => "UNKNOWN(ASCII)",
}



class MyClassText

  # 文字を16進数の文字コードに変換する
  def self.text_to_hex(data)
    data.unpack('H*')[0]
  end

  # 16進数の文字コードを文字に変換する
  def self.hex_to_text(data)
    data.gsub(/../){|c| c.hex.chr}
  end

  #string内の特定文字列を、指定した文字で置き換える。
  #戻り値;置き換えた文字列
  #        該当する文字列が存在しない場合は、元の文字列を返す
  def self.string_change(data,org,change)
    data.gsub( org, change )
  end
end #MyClassText 終了

実施結果

Content-Type: text/html

文字からHEXへ変換
船海システムG → 91448a43835683588365838047
TEST → 54455354
船 → 9144
kaisya会社123重厚重工業・・あaア  /\¥ →
6b616973796189ef8ed03132338f648cfa8f648d488bc68145a582a061b12081402f5c818f
kaisya会社123重厚重工業あaイ   →
6b616973796189ef8ed03132338f648cfa8f648d488bc682a061b2208140

1.9系では、なかむら(う)さんより、バグとの指摘です。

> こんにちは、なかむら(う)です。

> In message "[ruby-list:46415] Re: エラーでした;Re: Re:  再
> 送;;ruby1.8.7と1.9.2の文字処理について"
> on Sep.25,2009 20:16:21, <maki@...> wrote:
> > という前川さんの問題とは別に、このような文字列リテラルの挙動は
> > エラーで正しいのでしょうかね。ASCII文字では問題なさそうですし。
> > 本来はどういう扱いであるべきなのでしょうか?

> バグでしょう。
> Index: parse.y
> ===================================================================
> --- parse.y (revision 25091)
> +++ parse.y (working copy)
> @@ -5737,6 +5737,8 @@ parser_tokadd_string(struct parser_param
> }
> else if (c != term && !(paren && c == paren)) {
> tokadd('\\');
> +      pushback(c);
> +      continue;
> }
> }
> }

1.8系で、進めることにします。
今、作成中のシステムでは、上記の文字変換が、必須です。
また、逆に16進コードから、文字への変換も必要です。

文字→HEX→文字 の場合は、
kaisya会社123重厚重工業・・あaア  /\¥
 →
6b616973796189ef8ed03132338f648cfa8f648d488bc68145a582a061b12081402f5c818f
 → kaisya会社123重厚重工業・・あaア  /\¥

という結果がほしいのです。

ありがとうございました。

しかし、1.9系で、# -*- coding: windows-31j -*-を2行目rに追加しても
実行できない原因は、不明のままです。
どなたか、ご教示ください。

[ruby-list:46414] エラーでした;Re:  Re:  再送;;ruby1.8.7と1.9.2の文字処
理について

> 2.結果

> D:/Apache2.2/htdocs/ruby_prg/ruby19check/myclassTextTest.rb:13: invalid
> multibyte char (Windows-31J)
> D:/Apache2.2/htdocs/ruby_prg/ruby19check/myclassTextTest.rb:14: syntax
> error, unexpected tIDENTIFIER, expecting $end
> data5 ='kaisya会社123重厚重工業あaイ  '
> ^
> Complete(1)

> 何が、まずかったのでしょうか。
> Rubyは、1.9.1p129 です。
> Ruby1.9.2devでも、同様のエラーが出ました。