From: eiichi_maekawa@... Date: 2009-09-28T09:17:40+09:00 Subject: [ruby-list:46419] ;Re: Re: エラーでした;Re: Re: 再送;;ruby1.8.7と1.9.2の文字処理について 前川です。 なかむら(う)さん、高橋さん ありがとうございます。 実施したいのは、そのまま、変換することです。 (エスケープシケンスの\は、仕方ありませんが・・・) (\\は、\にしかできませんが) 本体;; #!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, 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でも、同様のエラーが出ました。