2011-03-29 59 views
1

我只有这两条线红宝石文件:红宝石1.9 - 无效的多字节字符(UTF-8)

# encoding: utf-8 
puts "—" 

当我与ruby test_enc.rb运行它,它失败:

test_enc.rb:2: invalid multibyte char (UTF-8) 
test_enc.rb:2: unterminated string meets end of file 

我不知道如何正确指定(emdash)的字符代码,但vim告诉我它是151, Hex 97, Octal 227。它与其他字符如ã的失败方式一样,所以我怀疑它是否与该字符特别相关。 我在Windows XP上运行和红宝石的版本,我使用的是:

ruby 1.9.1p430 (2010-08-16 revision 28998) [i386-mingw32] 

我觉得有一些很明显的,我在这里失踪。有任何想法吗?

编辑:了解了今天有关假设的宝贵经验 - 特别假设您的编辑器正在使用UTF-8而没有实际检查它。哎呀!

感谢您快速准确的回复!

再次编辑:'为utf-8正确设置vim'变得太大了,与这个问题无关,所以现在是separate question

+0

你确定它不是编码:utf-8? (而不是编码)。 – 2011-03-29 16:52:40

+0

两者都做同样的事情。你实际上可以放入'asdfgibberishcoding:utf-8',它的工作原理是一样的。 – 2011-03-29 16:54:45

+0

'puts _ENCODING_'是什么意思? (添加一个_ _ _ _ _ _ _ _ _ _ _ _ _ _ _的每个部分)。 – 2011-03-29 16:57:58

回答

5

鉴于Ruby明确地将您的注意力转向了UTF-8,我强烈怀疑您没有真正写出一个开头的UTF-8文件。确保Vim(或者你用来创建文件的任何文本编辑器)是真的设置为写出UTF-8。

请注意,在UTF-8中,任何非ASCII字符都将由多个字节表示,而不是像您从Vim诊断程序中描述的单个字节。我建议使用二进制文件编辑器(或转储,或其他)真的显示文本文件中的内容。一些没有预先设定编码概念的东西 - 甚至没有试图将其视为文本文件。

记事本可以让你用UTF-8编写一个文件,所以你可能想试试看看会发生什么。 (我自己没有安装Ruby,否则我会为你尝试。)

+0

我刚刚有同样的想法 - 什么是vim *实际上*保存文件为? 当我检查我看到它的编码设置为'latin1'。我想知道为什么这些数字不符合我在[here]中看到的内容(http://www.utf8-chartable.de/unicode-utf8-table.pl?start=8192&number=1024&unicodeinhtml=dec)。 – 2011-03-29 17:01:00

+0

将编码设置为“ISO-8859-1”(以匹配我的编辑器实际使用的内容)似乎可以解决此问题。当我打印出来的时候,我仍然会看到'ù',但我很确定这只是一个Windows终端问题。 – 2011-03-29 17:06:42

+1

@Nick:与其更改文件中的编码,不如更改编辑器使用的内容?那么你不会仅限于Latin-1,这是一个相当小的字符范围。我敢肯定* Vim必须支持其他编码... – 2011-03-29 17:09:21

3

您的文件在latin1中。 Ruby是对的。

emdash将被编码在UTF-8中的两个字节中。

+0

谢谢,您的评论是现货。 :) – 2011-03-29 17:11:50

+1

三,实际上:'0xE2 0x80 0x94'。 – 2011-03-29 17:55:50

+0

@Jörg:这就是我不想检查的原因;) – 2011-03-29 19:54:26