gpt4 book ai didi

ruby - 如何在 Ruby 中将 BOM 标记写入文件

转载 作者:数据小太阳 更新时间:2023-10-29 06:41:37 25 4
gpt4 key购买 nike

我有一些工作代码,可以将 BOM 标记添加到新文件。

  #writing
File.open name, 'w', 0644 do |file|
file.write "\uFEFF"
file.write @data
end

#reading
File.open name, 'r:bom|utf-8' do |file|
file.read
end

有什么方法可以自动添加标记而不用在数据前写神秘的 "\uFEFF" 吗?像 File.open name, 'w:bom' # this mode has no effect 也许吧?

最佳答案

**** 这个答案导致了一个新的 gem:file_with_bom ****

我过去遇到过类似的问题,我用 w-mode 的额外编码变体扩展了 File.open:

class File
BOM_LIST_hex = {
Encoding::UTF_8 => "\xEF\xBB\xBF", #"\uEFBBBF"
Encoding::UTF_16BE => "\xFE\xFF", #"\uFEFF",
Encoding::UTF_16LE => "\xFF\xFE",
Encoding::UTF_32BE => "\x00\x00\xFE\xFF",
Encoding::UTF_32LE => "\xFE\xFF\x00\x00",
}
BOM_LIST_hex.freeze
def utf_bom_hex(encoding = external_encoding)
BOM_LIST_hex[encoding]
end

class << self
alias :open_old :open
def open(filename, mode_string = 'r', options = {}, &block)
#check for bom-flag in mode_string
options[:bom] = true if mode_string.sub!(/-bom/i,'')

f = open_old(filename, mode_string, options)
if options[:bom]
case mode_string
#r|bom already standard since 1.9.2
when /\Ar/ #read mode -> remove BOM
#remove BOM
bom = f.read(f.utf_bom_hex.bytesize)
#check, if it was really a bom
if bom != f.utf_bom_hex.force_encoding(bom.encoding)
f.rewind #return to position 0 if BOM was no BOM
end
when /\Aw/ #write mode -> attach BOM
f = open_old(filename, mode_string, options)
f << f.utf_bom_hex.force_encoding(f.external_encoding)
end #mode_string
end

if block_given?
yield f
f.close
end
end
end
end #File

测试代码:

EXAMPLE_TEXT = 'some content öäü'
File.open("file_utf16le.txt", "w:utf-16le|bom"){|f| f << EXAMPLE_TEXT }
File.open("file_utf16le.txt", "r:utf-16le|bom:utf-8"){|f| p f.read }
File.open("file_utf16le.txt", "r:utf-16le:utf-8", :bom => true ){|f| p f.read }
File.open("file_utf16le.txt", "r:utf-16le:utf-8"){|f| p f.read }

File.open("file_utf8.txt", "w:utf-8", :bom => true ){|f| f << EXAMPLE_TEXT }
File.open("file_utf8.txt", "r:utf-8", :bom => true ){|f| p f.read }
File.open("file_utf8.txt", "r:utf-8|bom", ){|f| p f.read }
File.open("file_utf8.txt", "r:utf-8", ){|f| p f.read }

一些说明:

  • 代码来自 pre 1.9-times(但它仍然有效)。
  • 我使用 -bom 作为 bom 指示符(ruby 1.9 使用 |bom

一些需要修复才能变得更好:

  • 使用|bom代替-bom
  • 使用标准的r|bom阅读
  • 启用 ruby​​ 1.8 和 1.9

也许明天我会找时间重构我的代码并将其作为 gem 提供。

关于ruby - 如何在 Ruby 中将 BOM 标记写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9886705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com