I have a string in Ruby, s
(say) which might have any of the standard line endings (\n
, \r\n
, \r
). I want to convert all of those to \n
s. What's the best way?
This seems like a super-common problem, but there's not much documentation about it. Obviously there are easy crude solutions, but is there anything built in to handle this?
Elegant, idiomatic-Ruby solutions are best.
EDIT: realized that ^M
and \r
are the same. But there are still three cases. (See wikipedia.)
Since ruby 1.9 you can use String::encode
with universal_newline: true
to get all of your new lines into \n
while keeping your encoding unchanged:
s.encode(s.encoding, universal_newline: true)
Once in a known newline state you can freely convert back to CRLF using :crlf_newline
. eg: to convert a file of unknown (possibly mixed) ending to CRLF
(for example), read it in binary mode, then :
s.encode(s.encoding, universal_newline: true).encode(s.encoding, crlf_newline: true)