を、あなたは試してみてください:
[102, 111, 111, 246].map(&:chr).inject(:+)
あなたはエンコーディングの注意する必要があります。次の点に注意してください、それはコードポイントが0..127か128..256であるかどうかに応じて、US-ASCIIまたはASCII-8BITのいずれかを返すのが好きなので、デフォルトでは
irb(main):001:0> 0.chr.encoding
=> #<Encoding:US-ASCII>
irb(main):002:0> 127.chr.encoding
=> #<Encoding:US-ASCII>
irb(main):003:0> 128.chr.encoding
=> #<Encoding:ASCII-8BIT>
irb(main):004:0> 255.chr.encoding
=> #<Encoding:ASCII-8BIT>
irb(main):005:0> 256.chr.encoding
RangeError: 256 out of char range
from (irb):5:in `chr'
from (irb):5
from C:/Ruby200/bin/irb:12:in `<main>'
irb(main):006:0>
、256.chrは失敗します。
これは、8ビット値のポイントをカバーする必要があります。エンコードで
irb(main):006:0> Encoding.default_internal = "utf-8"
=> "utf-8"
irb(main):007:0> 256.chr.encoding
=> #<Encoding:UTF-8>
irb(main):008:0> 256.chr.codepoints
=> [256]
irb(main):009:0>
:あなたは255(おそらくUnicodeのコードポイント)より大きな値を持っている場合は、次の操作を行うことができます。
: - :default_internal "UTF-8"、> 255 Unicode値が正常に動作します(ただし下記参照)必要があるためにセットASCII-8BITとUTF-8が混在していないようです
irb(main):009:0> 65535.chr.encoding
=> #<Encoding:UTF-8>
irb(main):010:0> 65535.chr.codepoints
=> [65535]
irb(main):011:0> 65536.chr.codepoints
=> [65536]
irb(main):012:0> 65535.chr.bytes
=> [239, 191, 191]
irb(main):013:0> 65536.chr.bytes
=> [240, 144, 128, 128]
irb(main):014:0>
今では面白いです
irb(main):014:0> (0..127).to_a.map(&:chr).inject(:+).encoding
=> #<Encoding:US-ASCII>
irb(main):015:0> (0..128).to_a.map(&:chr).inject(:+).encoding
=> #<Encoding:ASCII-8BIT>
irb(main):016:0> (0..255).to_a.map(&:chr).inject(:+).encoding
=> #<Encoding:ASCII-8BIT>
irb(main):017:0> ((0..127).to_a + (256..1000000).to_a).map(&:chr).inject(:+).encoding
RangeError: invalid codepoint 0xD800 in UTF-8
from (irb):17:in `chr'
from (irb):17:in `map'
from (irb):17
from C:/Ruby200/bin/irb:12:in `<main>'
irb(main):018:0> ((0..127).to_a + (256..0xD7FF).to_a).map(&:chr).inject(:+).encoding
=> #<Encoding:UTF-8>
irb(main):019:0> (0..256).to_a.map(&:chr).inject(:+).encoding
Encoding::CompatibilityError: incompatible character encodings: ASCII-8BIT and UTF-8
from (irb):19:in `+'
from (irb):19:in `each'
from (irb):19:in `inject'
from (irb):19
from C:/Ruby200/bin/irb:12:in `<main>'
irb(main):020:0>
ASCII-8BITとUTF-8は限りASCII-8BITのコードポイントとして、連結することができ、すべての0..127である:
irb(main):020:0> 256.chr.encoding
=> #<Encoding:UTF-8>
irb(main):021:0> (0.chr.force_encoding("ASCII-8BIT") + 256.chr).encoding
=> #<Encoding:UTF-8>
irb(main):022:0> 255.chr.encoding
=> #<Encoding:ASCII-8BIT>
irb(main):023:0> (255.chr + 256.chr).encoding
Encoding::CompatibilityError: incompatible character encodings: ASCII-8BIT and UTF-8
from (irb):23
from C:/Ruby200/bin/irb:12:in `<main>'
irb(main):024:0>
これは、あなたの質問に究極のソリューションに私たちをもたらします:
irb(main):024:0> (0..0xD7FF).to_a.map {|c| c.chr("utf-8")}.inject(:+).encoding
=> #<Encoding:UTF-8>
irb(main):025:0>
だから私は、最も一般的な答えは、あなたがUTF-8にしたいと仮定すると、あるだと思う:
[102, 111, 111, 246].map {|c| c.chr("utf-8")}.inject(:+)
が、これは簡単です、あなたはあなたの値は0〜255である知っていると仮定すると:
irb(main):027:0> [102, 111, 111, 246].map {|c| c.chr("utf-8")}.inject(:+)
=> "fooö"
irb(main):028:0> [102, 111, 111, 246].map(&:chr).inject(:+)
=> "foo\xF6"
irb(main):029:0> [102, 111, 111, 246].map {|c| c.chr("utf-8")}.inject(:+).encoding
=> #<Encoding:UTF-8>
irb(main):030:0> [102, 111, 111, 246].map(&:chr).inject(:+).encoding
=> #<Encoding:ASCII-8BIT>
irb(main):031:0>
を私はこれはperha、少し遅くはいえ(役に立てば幸い:あなたを与える
[102, 111, 111, 246].map(&:chr).inject(:+)
ps) - これは同じ質問に対する答えを探しているので、私はそれを自分で調べました。
ソースコードとしてUTF-8を使用することもできます。 –
'codepoints'は、非UnicodeエンコーディングのUnicodeコードポイントを返さないことに注意してください(例えば、GB18030はUnicodeのすべてをエンコードしていてもこの目的のために" Unicode "ではありません)。 –