#author("2022-04-05T05:18:14+00:00","default:src128","src128") #author("2022-04-05T05:22:11+00:00","default:src128","src128") &tag(Ruby,文字列); *目次 [#w1af3a52] #contents *参考情報 [#i171ee5a] -[[Ruby]] *配列に分割する [#pb885f1d] **splitを使う [#wcc19383] -splitで正規表現を指定して配列に分割できる。 "a b".split(/ /) => ["a", "b"] **splitを使う(末尾をキープ) [#i32b5a39] -splitを引数なしで使うと末尾要素が削除されてしまうのでキープしたい場合は-1を指定する。 #pre{{ str = "\t\t\n" p str.split(/\t/) # 末尾に\rがあるので空白要素もキープされる str.chomp! p str.split(/\t/) # chomp!により\nがなくなったので末尾の空白要素が削除される。 p str.split(/\t/,-1) # -1を指定すれば大丈夫。 => ["", "", "\n"] [] ["", "", ""] }} *書式を指定して出力 [#p2193f9f] **ゼロで埋めて出力 [#m2ba0af1] -sprintfを使う sprintf("%03d", 7) => "007" *文字コード [#i32ad762] **Ruby 1.9以降の文字コードについて(2022/04/02(土)の理解) [#f329367b] -Rubyは文字コードの推測などは行わない。 **File.read [#n9729a5b] -File.readで読み込んだ場合、ファイルの実際文字コードがなんであろうと内部文字コード(例えばUTF-8)であるとして読み込む。 -このためSJISの場合は文字化けする。それを防ぐためにはファイルの文字コードを指定する必要あり。 File.read('sjis.txt', :encoding => 'SJIS') -推測したい場合はKconv.guessが使える。 **Net::HHTTP [#hf0dca2b] -Net::HTTPの場合 ASCII-8BITとみなしており、Content-Typeのcharsetであるとはみなさない。 -このため読み込んだ文字列を日本語正規表現とマッチさせようとするとエラーが発生する。 **日本語化どうかを判定する [#cc56579a] - ASCII以外の文字を含むかどうかで良い場合以下のメソッドで判定可能。UTF-8文字は3byte、ASCIIは1byteなため。 #pre{{ def jstring?(str) str.bytesize > str.size end }} *Tips [#i62fb6e8] **空文字の判定 [#b63f4af8] -ActiveSupportがあれば「blank?」が使える。 -Pure Rubyの場合以下の方法が使えるか。[[Is There a Better Way of Checking Nil or Length == 0 of a String in Ruby? - Stack Overflow:https://stackoverflow.com/questions/247948/is-there-a-better-way-of-checking-nil-or-length-0-of-a-string-in-ruby]] str.to_s.empty? str.to_s == "" str.to_s.size == 0 str.to_s.length == 0 -空じゃない場合は以下の方がわかりやすいか。空白文字を空と見なしたい場合stripする必要あり。[[Ruby way to check if a string is not blank? - Stack Overflow:https://stackoverflow.com/questions/35917560/ruby-way-to-check-if-a-string-is-not-blank]] str.to_s.size > 0 **文字コード変換(1.9以降) [#nbb1f7f6] ***Windowsのcmd.exeで文字化けしない方法 [#x584aac0] -Windowsのコマンドプロンプトで文字化けしない方法 -Ruby1.9時代はUTF-8をそのまま出力すると文字化けしていたが2.0以降default_externalがWindows-31Jに設定されていて、UTF-8でスクリプトを作成しても文字化けしなくなった。[[回答の編集履歴 - QA@IT:http://qa.atmarkit.co.jp/q/2628/a/15198/revisions]] #pre{{ puts Encoding.default_external => Windows-31J puts Encoding.default_internal => nil str = "ハロー" puts str.encoding => UTF-8 puts str #= ハロー }} ***Windowsの文字コード変換 [#c08933d4] -Windowsの文字コードに変換する #pre{{ def to_windows(str) str.encode("Windows-31J",:undef => :replace, :invalid => :replace, :replace => '_') end }} **文字コード変換 [#ab122e39] ***参考情報 [#o467778c] -[[Rubyist Magazine - 標準添付ライブラリ紹介 【第 3 回】 Kconv/NKF/Iconv:http://jp.rubyist.net/magazine/?0009-BundledLibraries#l28]] ***kconvを使う [#eb25f2db] ***nkfを使う [#g1977dbf] -kconvを使う方法は半角カナ→全角カナなどの自動変換が行われる。これを避けるためにはnkfモジュールを直接使う。 #pre{{ #EUCに変換 euc = NKF.nkf('-exm0', str) #SJISに変換 sjis = NKF.nkf('-sxm0', str) #UTF-8に変換 utf8 = NKF.nkf('-wxm0', str) #UTF-16に変換 utf16 = NKF.nkf('-w16xm0', str) }} ''オプションの意味'' ,e/s/w/w16,出力をEUC/SJIS/UTF-8/UTF-16にする ,E/S/W/W16,入力をEUC/SJIS/UTF-8/UTF-16にする ,x/X,半角カナ全角カナ変換を行わない/行う ,m0,MIME encoded-word のデコードを行わない **ERB [#x43893d9] -Railsでも使われているテンプレートライブラリ。 -標準ライブラリなのでRuby単体でも使用可能。 #pre{{ require 'erb' class Person def initialize(name) @name = name end attr_accessor :name end str = "hoge" person = Person.new('tanaka') template=<<__EOM__ value = <%= str %> value2 = <%= person.name %> __EOM__ erb = ERB.new(template) puts erb.result(binding) #以下が出力 value = hoge value2 = tanaka }}