我有一个非常简单的Scala代码
var str = "≤"
for( ch <- str ) { printf("%d, %x", ch.toInt, ch.toInt) ; println }
println
str = "\u2264" ;
for( ch <- str ) { printf("%d, %x", ch.toInt, ch.toInt) ; println }
如果在浏览器上无法正确显示,则第一个字符串在双引号之间包含一个字符,即小于或等于符号U + 2264。
程序输出
8218, 201a
226, e2
167, a7
8804, 2264
显然,第一个字符串在运行时长为3个字符,而不是源文件中的1个字符。
源文件存储在UTF-8中。十六进制转储表明它已正确编码,第一个字符串是22 E2 89 A422。我正在使用Eclipse和Eclipse的Scala插件。
要回答我自己的问题:
Scala编译器是否可以处理UTF-8编码的文件?
是的,但前提是它知道它们是UTF-8编码的。在没有其他证据的情况下,它使用Java的file.encoding
属性。(感谢@AndreasNeumann提供答案的这一部分。)
为什么我的程序无法按预期运行?
因为我的file.encoding
媒体资源设置为MacRoman
。即使我告诉eclipse文件是UTF-8,该信息也没有传达给Scala编译器。因此,编译器根据MacRoman
编码将3字节序列E2 89 A4解释为三个字符序列:一个较低的单引号(看起来很像一个逗号),一个“抑扬符”和一个节符号。这3个字符的序列的unicode是U + 201A U + 00E2 U + 00A7,它说明了我程序的输出。
您如何解决该问题?
在命令行上scalac
使用option -encoding UTF-8
。在eclipse中,您可以使用Scala插件的首选项(选项)来添加此选项。(感谢@Jesper提供答案的这一部分。)您还-D
可以在scalac
命令行上或通过JAVA_OPTS
环境变量使用该选项来设置file.encoding
属性。(有关详细信息,请参见@AndreasNeumann的答案。)
如果将Scala IDE用于Eclipse,则至少可以做三件事。
Properties
),在Resource
首选项下,选择UTF-8作为Text file encoding
。-encoding UTF-8
下additional command line parameters
下编译>>斯卡拉在首选项(或选项)。您可以将其设置为全局首选项(或选项)或项目特定的属性设置。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句