- 締切済み
Ruby 1.9.3でShift-JIS文字列を
よろしくお願いします。 Rubyでスマフォ(SH-02D)の電話帳のQUOTED-PRINTABLEの文字列を WindowsのShift-JIS文字列に変換してファイルに出力したいのですが putsだと日本語文字列に見えるのですが、printだと[]で囲まれた16進数の (一部は^のように表示されますが)列になってしまいます。 ネットで検索してもprintはそのまま、putsは強制改行があるという 違いしかないように思えるのですがどうすればputsと同じ出力を 強制改行無しに出力できるのでしょうか。 RubyはWindows 7 Professional x64でeclipse INDIGOにAptana Studioを 入れて入力&実行しています。 (プレアデスも入ってます。ソースのエンコードはS-JISです。) sub_column = column[i].split("/;/") quoted_string = sub_column[j].unpack("M") puts quoted_string print quoted_string ---- (抜粋) でputsとprintで見え方が違うのです。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- ki073
- ベストアンサー率77% (491/634)
普段は1.8.7を使っていてそろそろ1.9へ移行しなければということで、まだ理解できていないところもありますが、 quoted_string.force_encoding("Shift_JIS") でundefined methodになるのは、マニュアルによると.unpack("M")の結果はArrayになります。Stringにするには quoted_string.to_s.force_encoding("Shift_JIS") でどうなりますでしょうか? Array出力しようとしたら、当然to_sを実行後出力されるが、微妙な差がprintとputsにはあるのでしょうか。 macrubyではなく1.9.3で実行してみたら p Encoding.default_internal #-> nil p Encoding.default_external #-> #<Encoding:UTF-8> となりました。nilでも良いみたいですね。 StringIOを使う方法ですが require "stringio" str="" StringIO.open(){|io| io.puts "あいうえお" io.pos=io.pos-1 io.puts "あいうえお" io.pos=io.pos-1 str=io.string } print str こんな感じです。上の例はOSXですので改行コードがLF一文字です。Windowsは-2しないといけないかも知れません。
- ki073
- ベストアンサー率77% (491/634)
エンコーディングは正しく設定されているでしょうか? p Encoding.default_internal で確認できます。 こちらはmacruby0.9を使っていますが、書き方が悪いのかもしれませんが magic commentが無視されるようで、何を指定してもUTF-8になってしまいます。 (UTF-8で実害はないです) 念のため、 quoted_string.force_encoding("Shift_JIS") としてみてはいかがでしょうか。 あとは、 print quoted_string.to_s や print "#{quoted_string}" にしてみるとか、 どうしようもなければStringIOにputsで出力してposを改行コード分もどすとか。
お礼
(ごめんなさい。ここに上のような事を書くべきだったのでしょうか。) どうもありがとうございました。
補足
ありがとうございます。 p Encoding.default_internal の結果はnilと表示されました。 ソース先頭にマジックコメントで# encoding:Windows-31Jと設定しているのですが。 quoted_string.force_encoding("Shift_JIS") はundefined methodになりました。 後の二つでもどうしても16進数(一部記号)の文字列になったままです。 posを戻すか手作業で出力ファイルから改行を取り除くしかないようですね。 これはprintの仕様なのでしょうか。 それともどこかに報告した方が良いような不具合なのでしょうか。
お礼
どうもありがとうございます。 今、直そうとしていたらどこか(eclipse or Aptanaの)設定を変えてしまったのか、 スクリプトの編集ミスか単語の色分けなどが変わってしまって混乱しています。 ちょっとまだ未確認なのですが、 <書き込みファイルオブジェクト>.puts( hoge )で単純な文字列は強制改行されますが Array(?)データは改行されないように見えたかもしれないです。 unpackした漢字文字列(S-JIS)の直後が改行されていないようにちらっと見えたので どちらにせよ確認もすぐに出来ないのですみません。 バージョン管理を自動でしててくれてるかもしれませんが、 eclipseの操作自体まだ慣れていない状態です。
補足
今日eclipseを立ち上げたらエディターの単語色分けは戻ってました。 御二方のアドバイス通りにposを-2する事で対処することにしました。 昨日の時点ではRubyは1.9.3ではなく1.9.1でした。 インストール先を間違っていたので環境変数のPATHがVer. 1.9.1を指していました。 1.9では require "stringio" は不要なようです。 今度は逆変換のスクリプトを作るつもりです。 単にunpack("M")をpack("M")にしただけでは駄目なようです。