使用utf-8编码写入和读取文件

Der*_*ley 42 ruby utf-8

我一直在阅读所有与UTF-8相关的问题和博客文章,我在test.rb文件中有以下示例:

# encoding: UTF-8
File.open("test.txt", "w") do |f|
  f.write "test © foo"
end

File.open("test.txt", "r") do |f|
  puts f.read
end
Run Code Online (Sandbox Code Playgroud)

这很完美.在文件中正确生成©符号,它将©读回我并将其打印在屏幕上.

但是当我在实际项目中使用相同的代码时,我将其写入文件而不是©符号: \u00A9

FWIW:我在对我的代码运行rspec(v1.2.9)测试时得到了这个结果.规范生成一个带有©符号的文件,然后重新读取文件以检查内容.

我目前正在Ruby 1.9.2中运行它,但我还需要支持一直回到Ruby 1.8.6.这是一个使用RubyInstaller.org版本的Ruby的Windows环境.

pet*_*ter 47

如果我执行你的代码我会在特殊字符上出错.你能试试这段代码吗?

# encoding: UTF-8
File.open("test.txt", "w:UTF-8") do |f| 
  f.write "test \u00A9 foo" 
end 

#Encoding.filesystem = "UTF-8"
p Encoding.find("filesystem") 
File.open("test.txt", "r:UTF-8") do |f| 
  puts f.read 
end 
Run Code Online (Sandbox Code Playgroud)

在我的窗户盒子上我然后得到

#<Encoding:Windows-1252>
test © foo
Run Code Online (Sandbox Code Playgroud)

我不知道为什么那里..

  • 你在运行ruby的控制台是什么?如果是Windows命令提示符,则它不理解UTF-8,因此Windows CP-1252应用程序正在显示您的UTF-8输出. (3认同)

tok*_*khi 41

用更少的代码读取文件:

# encoding: UTF-8
file_content = File.open("test.txt", "r:UTF-8", &:read)
Run Code Online (Sandbox Code Playgroud)


ALo*_*LoR 4

您的应用程序在哪个操作系统上运行?文件的默认编码可能是 ASCII。如果在开放参数中添加w:utf-8和会有帮助吗?r:utf-8