gpt4 book ai didi

Ruby 1.8 Iconv UTF-16 到 UTF-8 失败,出现 "\000"(Iconv::InvalidCharacter)

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

我在处理 Windows 机器上生成的表格数据的文本文件时遇到问题。我在 Ruby 1.8 工作。在处理文件中的第二行时,以下给出错误(“\000”(Iconv::InvalidCharacter))。第一行正确转换。

require 'iconv'
conv = Iconv.new("UTF-8//IGNORE","UTF-16")
infile = File.open(tabfile, "r")
while (line = infile.gets)
line = conv.iconv(line.strip) # FAILS HERE
puts line
# DO MORE STUFF HERE
end

奇怪的是它读取并转换文件中的第一行没有问题。我在 Iconv 构造函数中有//IGNORE 标志——我认为这应该可以抑制这种错误。

我一直在兜圈子。任何建议将不胜感激。

谢谢!

编辑:霍布斯解决方案解决了这个问题。谢谢你。只需将代码更改为:

require 'iconv'
conv = Iconv.new("UTF-8//IGNORE","UTF-16")
infile = File.open(tabfile, "r")
while (line = infile.gets("\x0a\x00"))
line = conv.iconv(line.strip) # NO LONGER FAILS HERE
# DOES MORE STUFF HERE
end

现在我只需要找到一种方法来自动确定要使用的获取分隔符。

最佳答案

错误消息非常模糊,但我认为它在一行中发现奇数 个字节这一事实令人不快,因为 UTF-16 中的每个字符都是两个(或偶尔是四个) ) 字节。我认为 that 的原因是您使用了 gets——文件中的行由 UTF-16le 换行符分隔,即 0x0a 0x00,但 gets 正在拆分(并且 strip 正在删除)仅 0x0a

举例说明:假设文件包含

ab
cd

以 UTF-16le 编码。那是

0x61 0x00 0x62 0x00 0x0a 0x00 0x63 0x00 0x64 0x00 0x0a 0x00
a b \n c d \n

gets 读取到第一个 0x0astrip 将其删除,因此读取的第一行是 0x61 0x00 0x62 0x00,iconv 乐​​于接受并将其编码为 UTF-8 作为 0x61 0x62 — “ab”。 gets 然后读取下一个 0x0astrip 再次删除,所以第二次 line 得到 0x00 0x63 0x00 0x64 0x00 现在一切都搞砸了——我们有一个字节不同步,要转换的字节数是奇数,iconv 崩溃了,因为它不兼容与您要求它做的事情。

缺少实际工作的文件编码/解码层,我想你想要的是更改 "\n" 中的 gets 分隔符 ("\x0a ") 到 "\x0a\x00",放弃对 strip 的所有使用,因为它不是编码干净的,并使用 print而不是 puts 这样你就不会添加额外的行尾(因为你将转换你已经拥有的那些)。

如果您使用的是 Windows 文件,UTF-16le 格式的 Windows CRLF 是 "\x0d\x00\x0a\x00"

关于Ruby 1.8 Iconv UTF-16 到 UTF-8 失败,出现 "\000"(Iconv::InvalidCharacter),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6172095/

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