2016-07-06 24 views
2

Ich stieß auf ein seltsames Problem beim Aufblasen und Entleeren von Strings mit nicht-brechendem Platz in Ruby.Zlib mit non-breaking Raum

Strings mit regelmäßigen Räumen verhalten sich wie erwartet:

str = "hello world"; str_zipped = Zlib.deflate str; str == Zlib.inflate(str_zipped) 
=> true 

, jedoch

str = "hello\xA0world"; str_zipped = Zlib.deflate str; str == Zlib.inflate(str_zipped) 
=> false 

Ist das ein erwartetes Verhalten oder ein Bug?

Antwort

3

ZLib behält die Codierung nicht bei. Ihre Zeichenfolge ist wahrscheinlich UTF-8 codiert:

str = "hello\xA0world" 
str.encoding 
#=> <Encoding:UTF-8> 

Aber ZLib gibt eine ACSII codierte Zeichenfolge:

str_zipped = Zlib.deflate str 
str = Zlib.inflate(str_zipped) 
str.encoding 
#=> <Encoding:ASCII-8BIT> 

Aber wenn man beheben dass encoding:

str = "hello\xA0world" 
str_zipped = Zlib.deflate str 
str_utf8 = Zlib.inflate(str_zipped).force_encoding('UTF-8') 
str == str_utf8 
#=> true