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

Posted

技术标签:

【中文标题】使用 utf-8 编码写入和读取文件【英文标题】:Write and read a file with utf-8 encoding 【发布时间】:2011-07-07 00:10:37 【问题描述】:

我一直在阅读所有与 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

这非常有效。 is 在文件中正确生成 © 符号,并将 © 读回给我并将其打印在屏幕上。

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

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

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

【问题讨论】:

【参考方案1】:

如果我执行你的代码,我会在特殊字符上得到一个错误。你能试试这个代码吗?

# 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 

然后在我的 windows 盒子上得到

#<Encoding:Windows-1252>
test © foo

我不知道为什么会有 Â..

【讨论】:

你在哪个控制台运行 ruby​​?如果是 windows 命令提示符,它不理解 UTF-8,因此您的 UTF-8 输出正在由 Windows CP-1252 应用程序显示。 注意:你可以用text = File.open(filename,'r:UTF-8',&amp;:read)更简洁地阅读UTF-8 在 Windows 中,您可以更改代码页以使用 chcp 65001 理解 utf8,但仍有一些亚洲符号无法正确显示为 reproduced。【参考方案2】:

用更少的代码读取文件:

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

【讨论】:

【参考方案3】:

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

【讨论】:

我尝试了您建议的编码提示,但在运行 RSpec 测试时似乎没有什么不同。我更新了我的问题以包括 ruby​​ 版本/平台信息。也许我需要升级到 rspec 2.x

以上是关于使用 utf-8 编码写入和读取文件的主要内容,如果未能解决你的问题,请参考以下文章

python读取和写入csv文件

中文乱码——编码问题

字节流读取和写入文件中中文

在 C++11 中读取/写入/打印 UTF-8

08 转换流

Unicode (UTF-8) 在 Python 中读取和写入文件