这是一个字符编码问题。从 JPEG 中读取前 4 个字节会返回一个 ASCII 编码字符串:
head = File.read("some.jpg", 4)
# => "\xFF\xD8\xFF\xE1"
head.encodig
# => #<Encoding:ASCII-8BIT>
另一方面,字符串是 UTF-8 编码的:
jpg_prefix = "\xff\xd8\xff"
# => "\xFF\xD8\xFF"
jpg_prefix.encoding
# => #<Encoding:UTF-8>
比较 UTF-8 和 ASCII 字符串不能按预期工作:
head[0,3] == jpg_prefix
# => false
您必须使用以下命令显式设置编码String#force_encoding
:
jpg_prefix = "\xff\xd8\xff".force_encoding(Encoding::ASCII_8BIT)
# => "\xFF\xD8\xFF"
jpg_prefix.encoding
# => #<Encoding:ASCII-8BIT>
head[0,3] == jpg_prefix
# => true
Integer#chr
连接使用(由 Mario Visic 建议)创建的 ASCII 字符也可以:
jpg_prefix = 0xff.chr + 0xd8.chr + 0xff.chr
# => "\xFF\xD8\xFF"
jpg_prefix.encoding
# => #<Encoding:ASCII-8BIT>
或通过使用Array#pack
:
jpg_prefix = ["FFD8FF"].pack("H*")
# => "\xFF\xD8\xFF"
jpg_prefix.encoding
# => #<Encoding:ASCII-8BIT>