Tùy thuộc vào các giá trị trong mảng của bạn và giá trị của Encoding.default_internal
, bạn có thể thử:
[102, 111, 111, 246].map(&:chr).inject(:+)
Bạn phải cẩn thận của các bảng mã. Lưu ý những điều sau:
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>
Theo mặc định, 256.chr thất bại bởi vì nó thích trở về hoặc là US-ASCII hoặc ASCII-8 bit, tùy thuộc vào việc các điểm mã là trong 0..127 hoặc 128..256.
Điều này sẽ bao gồm điểm của bạn cho các giá trị 8 bit. Nếu bạn có các giá trị lớn hơn 255 (có thể là các điểm mã Unicode), thì bạn có thể thực hiện như sau:
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>
Với mã hóa.default_internal thiết lập để "utf-8", các giá trị Unicode> 255 sẽ làm việc tốt (nhưng xem dưới đây):
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>
Bây giờ nó trở nên thú vị - ASCII-8 bit và UTF-8 dường như không để trộn:
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-8 bit và UTF-8 có thể được nối, miễn là codepoints ASCII-8 bit là tất cả trong 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>
này đưa chúng ta đến một giải pháp cuối cùng cho câu hỏi của bạn :
irb(main):024:0> (0..0xD7FF).to_a.map {|c| c.chr("utf-8")}.inject(:+).encoding
=> #<Encoding:UTF-8>
irb(main):025:0>
Vì vậy, tôi nghĩ câu trả lời chung nhất là, giả sử bạn muốn UTF-8, là:
[102, 111, 111, 246].map {|c| c.chr("utf-8")}.inject(:+)
Giả sử bạn biết giá trị của bạn trong 0..255, thì đây là dễ dàng hơn:
[102, 111, 111, 246].map(&:chr).inject(:+)
đem lại cho bạn:
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>
tôi hy vọng điều này sẽ giúp (mặc dù hơi muộn, perha ps) - Tôi thấy điều này tìm kiếm một câu trả lời cho cùng một câu hỏi, vì vậy tôi đã tự nghiên cứu nó.
Bạn cũng có thể chỉ sử dụng UTF-8 làm mã hóa nguồn của mình. –
Lưu ý rằng 'codepoints' không * không * trả về codepoint Unicode cho mã hóa không phải Unicode (ví dụ: GB18030 không phải là" Unicode "cho mục đích này mặc dù mã hóa tất cả Unicode). –