uji*_*fgc 12 ruby byte-order-mark utf-8
我有一些带拐杖的工作代码,可以将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
Run Code Online (Sandbox Code Playgroud)
有没有办法自动添加标记而不"\uFEFF"
在数据之前写隐藏?喜欢的东西File.open name, 'w:bom' # this mode has no effect
可能?
****这个答案导致一个新的宝石:file_with_bom****
我过去遇到了类似的问题,并且我File.open
为w
-mode 扩展了其他编码变体:
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
Run Code Online (Sandbox Code Playgroud)
Testcode:
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 }
Run Code Online (Sandbox Code Playgroud)
一些评论:
-bom
bom指标(ruby 1.9使用|bom
.一些需要修复的更好:
|bom
替代-bom
r|bom
阅读也许明天我会找一些时间重构我的代码并将其作为宝石提供.
唉,我认为您的手动方法是可行的方法,至少我不知道更好的方法:
http://blog.grayproductions.net/articles/miscellaneous_m17n_details
引用 JEG2 的文章:
Ruby 1.9 不会自动向您的数据添加 BOM,因此如果您需要,您将需要注意这一点。幸运的是,这并不太难。基本思想只是在文件开头打印所需的字节。
归档时间: |
|
查看次数: |
8281 次 |
最近记录: |