上个星期做第一次R作业,看到坛子上有人问中文乱码相关的一些问题。做完作业后,想在这里总结一下,和大家分享。
(一)中文问题的由来
各个国家的文字往往都有差别,西方主要是使用拉丁字符系列,而东方则以汉字为代表,使用象形或会意文字。由于早期的计算机在西方使用较多,所以支持的文字以拉丁语系为主,这种编码体系在国际上有一个标准,就是ISO-8859系列,特点是仅支持拉丁语系的字符,我们国家的汉字是不在这个系列之中的。虽然ISO-8859不包含中文编码,但它在计算机中处理的速度也是最快的,这使得很多西方人开发的软件都采用这种编码,这使得我们中国人在使用时就有可能会遇到中文乱码问题。
(二)我国的汉字编码标准
实际上,随着计算机的普及,很多国家也都制定了和本国文字相关的一些计算机标准,我们国家的几个标准罗列如下:、
这里的GB代表“国标”的首字母拼音简写,这是我国早期制定的用于计算机中汉字处理和存储的标准,里面包含了6000多常用汉字的编码规定,不过繁体和一些难检字在这个标准里面没有包含进来,比如著名的前总理名字中的那个“镕”字就没有。
是GB2312的扩充,实际上就是“国标扩”的拼音首字母缩写。它包括了繁体和大部分难检字,中文Windows2000、XP等都使用了这个标准做为系统文本存储的默认编码。
这是在GBK基础上进一步的扩充的标准,包含了中、日、韩等多国文字编码规则(简称CJK编码,CJK即Chinese、Japanese、Korean),当然也包含我国少数民族如蒙、回等文字。的GB18030标准在2005年发布。
我们国家其他地区由于历史的原因也有一些独立的编码体系,比如台湾的Big5码和香港的HK码,他们和GB系列的不同,主要用于繁体汉字。
(三)国际编码标准
针对不同国家的文字编码问题,计算机界在国际上的支持主要通过Unicode系列编码进行支持,这个编码本身的意思就是“统一码”。Unicode有很多变种,其中常见的就是UTF-8编码。UTF-8编码是很多操作系统的默认编码,比如Uninx/
Linux/Mac OSX等。中文Windows当然也支持这种编码,但UTF-8并不是默认的编码。
注意,上述的各种文字编码,其实就是在存储文本文件时,里面的字符用何种编码规则进行存储的规则。因为很多编程语言都要通过文本文件存储程序代码,所以,一但代码中包含了中文,就要注意对应源文件在存储时的编码方式,只不过大部分代码编辑软件都可以自动处理这个问题,但也有个别的源代码编辑软件在这方面处理不好。
(四)R中的中文问题
一般来说, 直接在R中使用中文是没有问题的,比如变量名就可以使用中文,例如:
向量1=c(1:10);
print(向量1);
不过,在一个独立的源文件中编写R代码,再进入R中执行时,如果代码中包含中文,有时就会出现问题,这和R运行的具体平台有关。我们都知道,在R中执行一个源文件中的代码时,需要使用source函数,假设该R源文件位于R的工作目录中,则基本的用法如下:
source("源文件名")
source函数在执行时,其中的源文件默认为系统缺省编码。在中文Windows系统中,如果使用记事本或者写字板编辑代码,则在保存后,其默认的编码都是默认的GB系列,所以也一般不会出现问题。但是,如果使用RStudio,情况就不尽相同了。
RStudio是个跨平台的软件,它需要考虑Linux、苹果系统Mac OSX和Windows等多个平台的兼容性问题,由于UTF-8的通用性,所以,在RStudio中新建一个R源文件时,它默认的编码是utf-8;而在保存这个文件时,RStudio默认会询问该文件用什么编码保存,如果此时选择了UTF-8,然后使用source命令执行,也许就会出现一些问题。为了避免这个问题,可以在source函数中指明文件的编码为utf-8:
souce("源文件",echo=TRUE,encoding="utf-8")
echo这个参数是指在运行源文件时显示源代码,这样在运行时比较容易观察结果。encoding参数就是指定源文件存储的编码,此处为utf-8。
当然,直接使用RStudio,它会根据文件的编码,自动发送对应的一些参数,所以一般也不会出现问题。
在使用
R语言的write系列函数产生文本文件以便其他软件可以使用这些数据时,也可能会出现乱码问题。比如,R在西文Windows中,write.table、wirte.csv等函数会按照西文系统默认的编码产生文本文件,这使得其中包含的中文就有可能得不到正确的存储。因此,在使用write.table等函数时,较好指定产生的文本文件的编码,这时只需要添加fileEncoding="中文编码名"这个选项就可以了。比如,作业里要求将数据框变量内容存入一个文本文件,假设数据框变量名为df,可以使用如下代码:
wirte.table(df,file="df.txt",fileEncoding="GBK")
这样,写入的文本文件在任何操作系统中都不会出现中文乱码。当然,将fileEncoding参数指定为UTF-8也可以。不过,对于中文Windows的Winword、
Excel仅支持GB系列的编码,所以,如果生成的是在Excel中应用的CSV文本文件时,还是应采用GB2312或者GBK。同样,为了避免read系列函数在读出文本数据时产生乱码,较好也要指定文件的编码。比如对上述df.txt文件中的数据读出,可以使用这样的代码:
df=read.table("df.txt",header=TRUE,check.names=FALSE,fileEncoding="GBK")
(五)结语
上述的讨论,一般都是发生在不同语言环境下,或者是不同操作系统中的R版本中,在中文的Windows中一般较少出现。但了解这些,有助于在出了乱码问题时,寻找解决方案的思路。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。