5

Ruby では、「ä」のパーセント エンコーディングを次のように取得します。

require 'cgi'
CGI.escape('ä')
=> "%C3%A4"

と同じ

'ä'.unpack('H2' * 'ä'.bytesize)
=> ["c3", "a4"]

2 つの質問があります。

  1. 最初の操作の逆は何ですか? そうじゃないかな

    ["c3", "a4"].pack('H2' * 'ä'.bytesize)
    => "\xC3\xA4"
    
  2. 私のアプリケーションでは、「ä」を「%E4」としてエンコードする必要があります。これは、「ä」.ord の 16 進値です。それのためのRubyメソッドはありますか?

4

1 に答える 1

5

コメントで述べたように、文字 ä をコードポイント 228 (0xE4) と同一視することは、ISO 8859-1 文字エンコーディングを扱っていることを意味します。

そのため、文字列に必要なエンコーディングを Ruby に伝える必要があります。

str1 = "Hullo ängstrom" # uses whatever encoding is current, generally utf-8
str2 = str1.encode('iso-8859-1')

次に、好きなようにエンコードできます。

require 'cgi'
s2c = CGI.escape str2
#=> "Hullo+%E4ngstrom" 

require 'uri'
s2u = URI.escape str2
#=> "Hullo%20%E4ngstrom" 

次に、それを元に戻すには、まず (a) 値のエスケープを解除し、次に (b) エンコーディングを使い慣れたもの (おそらく UTF-8) に戻して、コードポイントをどの文字エンコーディングとして解釈すべきかを Ruby に伝えます。 :

s3a = CGI.unescape(s2c)  #=> "Hullo \xE4ngstrom"
puts s3a.encode('utf-8','iso-8859-1')
#=> "Hullo ängstrom"

s3b = URI.unescape(s2u)  #=> "Hullo \xE4ngstrom"
puts s3b.encode('utf-8','iso-8859-1')
#=> "Hullo ängstrom"
于 2015-07-09T13:27:52.620 に答える