2011-08-10 6 views
0

私はRuby 1.8.7を使用しています(アップグレードはオプションではありません)。私は "\ uXXXX"と書かれた0から127までのすべてのUTF-8コードポイントの文字列を作成したいと思います。変数を使用したRubyでのUTF-8エンコーディング

私の問題は、これが(たとえば) 'u0008'と解釈されていることです。 '\ u0008'を使用しようとすると、文字列は "\ u0008"になります。これは私が望むものではありません。

私はさまざまな方法を試しましたが、まさに "\ uXXXX"という文字列を作成することは不可能です。 "\ u000B" 「\ u000B」または「u000B」のいずれかです

「\」をエスケープすることはオプションではありません。サーバーに文字列を送る必要があります。例えば、サーバーは '\ u000B'を受信します。それは、他のサーバが\ uXXXX構文の解析をテストできるようにするためです。しかしこれはRubyでは不可能と思われます。

ハッピー誰かが私が間違っていることを証明できるかどうか:)

+0

ちょうどそれを明確にする:UTF-8コードポイント0から127までは、ASCIIの場合とまったく同じです。複雑な手順を経て作成する必要はありません。 – deceze

+0

期待される結果は正確に何にしたいですか?あなたが探しているデータのサンプルを提供してください。 – Casper

+0

明確にするために、私が実際に期待しているのは、例えば "U + 1 = \ u0001,16x = \ x01、U + 117 = \ u0075、16進= \ x75"です。 – Robin

答えて

2

使用Integer #chr文字を取得します。

(1..127).each do |i| 
    value << "U+#{i} = #{i.chr}, hex = \\x#{"%02x" % i}; " 
end 

"%02x" % isprintf("%02x", i)に等しい:ここではクリーンバージョンです。整数を2桁の16進数で返します。

は(コメントを参照)の出力をエスケープ:

(1..127).each do |i| 
    value << "U+#{i} = \\u#{"%04x" % i}, hex = \\x#{"%02x" % i}; " 
end 
+0

はい、これは機能します。 128より小さいコードポイントに対してASCIIとUTF-8が同一であるため、UnicodeやRuby 1.9.2を心配する必要はありません。 –

+0

明確にするために、私が実際に期待しているのは、たとえば "U + 1 = \ u0001,16x = \ x01、U + 117 = \ u0075、16進= \ x75"という値です。上記の私に与えられていることは、 "U + 1 = \ 0001、hex = \ x01、U + 117 = \ 0075、hex = \ x75"です。私はJSONをエスケープするために文字列が必要なので、\ uが必要です。 – Robin

+0

また、これに追加するには、無効なエスケープ文字シーケンスに関する警告が表示されるため、 "\ x" << strを使用することはできません。しかし、 '\ x' << strを使用すると、\\ xが得られ、文字列が16進数に正しく変換されない – Robin

関連する問題