新手问题 把字符串写入文件保留'\n'

toctan · 2013年05月25日 · 最后由 toctan 回复于 2013年05月25日 · 4947 次阅读
str = "<ul>\n<li>One</li>\n<li>Two</li>\n</ul>\n"

File.open('test', 'w') do |f|
  f.write(str)
end

这样 test 文件的内容为:

<ul>
<li>One</li>
<li>Two</li>
</ul>

我想保留'\n',在文件里显示为一行,应该怎么写啊?

字符串用单引号。

#1 楼 @yesmeck 哦,这我也知道。不过这串字符串是另一个函数的返回结果。

这个就是换行符呀,你的所有 \n 已经被保留了,不信你试试看:

File.open('test').read

#3 楼 @lgn21st 我的意思是:我希望文件的内容为:

<ul>\n<li>One</li>\n<li>Two</li>\n</ul>\n

很难理解这种需求,可以按照字节来输出

str.each_byte {|i| print i }

str = "

    \n
  • One
  • \n
  • Two
  • \n
\n"

puts str.inspect # => "

    \n
  • One
  • \n
  • Two
  • \n
\n"

#6 楼

File.open('test', 'w') do |f|
  f.write(str.inspect[1...-1])
end

#5 楼 @lgn21st 我需要将 markdown 的输出用 document.write() 包裹之后生成一个 js 文件,直接写入在括号里会生成多行 html

#8 楼 @toctan 那用 str.to_json 就好了

#6 楼 @alsotang #7 楼 @luikore Wow, 很完美的解决方法。

str1 = "<ul>\n<li>One</li>\n<li>Two</li>\n</ul>\n"
puts str.gsub("\n", "\\n") # => <ul>\n<li>One</li>\n<li>Two</li>\n</ul>\n
puts str.inspect               # => "<ul>\n<li>One</li>\n<li>Two</li>\n</ul>\n"

str2 = "<p><code>\nputs &quot;hello,\\nworld&quot;\n</code></p>\n"
puts str.gsub("\n", "\\n")     
# => <p><code>\nputs &quot;hello,\nworld&quot;\n</code></p>\n
puts str.inspect
# => "<p><code>\\nputs &quot;hello,\\nworld&quot;\\n</code></p>\\n"

我尝试过str.gsub("\n", "\\n"),对于前一种情况没问题,后面的就出错了。

#9 楼 @luikore 也行,不过 to_json 不是返回 json 么?怎么和 str.inspect 返回的结果一样?

str.inspect == str.to_json   # => true

#11 楼 @toctan 因为 inspect 的结果是 ruby 字符串,to_json 的结果是 json 字符串,两种格式略有区别的。你要在 javascript 里用就 to_json 好了

最明显可以看出区别的就是 '&'.to_json'&'.inspect , "&" 在 json 里是要转义的但在 ruby 不用

需要 登录 后方可回复, 如果你还没有账号请 注册新账号