出现这种情况的原因就是使用了express的框架用了静态服务。
app.use(express.static(path.join(__dirname, ‘public’)))
就是讲所有的静态资源文件都托管到public文件夹里。然后所有需要调用img图片什么的不管你在哪个文件夹,你都把自己当成是public文件夹即可。
直接在public里面写上路径就是正确的了。
JavaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为JavaScript引擎,为浏览器的一部分,森裤早广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用此雀,用来给HTML网页增加动态功能。
在1995年时,由Netscape公司的Brendan Eich,在网景导航者浏览器上首次设计实现而成。因为Netscape与Sun合作,Netscape管理层希望它外观看起来像Java,因此取名为JavaScript。但实际上纯斗它的语法风格与Self及Scheme较为接近。
为了取得技术优势,微软推出了JScript,CEnvi推出ScriptEase,与JavaScript同样可在浏览器上运行。为了统一规格,因为JavaScript兼容于ECMA标准,因此也称为ECMAScript。
linux环境下,我们可以通过 iconv 这个C++模块来处理Node.JS不支持的字符编码,如GBK,BIG5。iconv需要依赖native库,这样一来,在一些不支持native模块安装的虚拟主机和windows平台上,我们还是无法安心处理GBK编码。Google之,发现有老外写了一个通过纯Javascript转换编码的模块 iconv-lite ,不过仅支持少许单字节编解码。这个模块的初衷和我一致并且代码组织结构优雅,于是在github上fork了该项目准备支持GBK的编解码。这里是fork的项目。
之前对字符编码的认识我只停留在API转换阶段,对于Unicode、UTF8和GBK之枣弯间的关系和其内部转换原理则非常模糊。比如,使用JAVA代码转换UTF8编码到GBK编码:
String gbkString = new String(utf8String.getBytes("UTF8"), "GBK")
为了编写iconv-lite模块的gbk支持,不得不再一次学习字符编码原理,维基百科是首选的非常系统的学习资料:
Unicode 维基百科
基本多文种平面
GBK 维基百科
通过这些资料,基本弄清楚了以下几点:
Unicode是全世界通用编码
UTF8,UTF16,UTF32
只是Unicode的实现方式之一。UCS2是UTF16的子集,UCS2编码中每个Unicode使用两个字节编码,高字节在高位。Node.JS支持
Buffer.toString('UTF8')和Buffer.toString('UCS2')。
GBK也是Unicode的实现方式之一,总共23940个编码,编码范围可见下图:
UTF8与GBK进行转换,可以把Unicode作为中间编码。
UTF8编解Unicode规则简单,参见 UTF8
GBK编解Unicode无特定规则,一般可通过查表方式
GBK兼容ascii码,ascii字符用一字节编码,最高位为0,其它字符用两位编码,高字节从0x81。编解码时通过此规律对单字节和双字节字符加以区分。由此可见,GBK是单字节、双字节变长编码。
理解了上面几点后,编解散清码GBK文件其实只需要一个GBK-->Unicode的码表就够了。GBK编码时,通过
Unicdoe-->GBK,生成相应的GBK字节流;GBK解码时,通过GBK-->Unicode,生成UCS2字节流,再通过
buffer.toString('UCS2')即可转换成string对象。我制作的一张GBK码表可参见 这里 。
目前,GBK编解码支持已经merge回作者的iconv-lite,并和作者商量修改了接口名字凳掘闷。感兴趣的同学可以这样使用:
npm install iconv-lite
var iconv = require('iconv-lite')
var str = iconv.decode(buf, 'GBK')//return unicode string from GBK encoded bytes
var buf = iconv.encode(str, 'GBK')//return GBK encoded bytes from unicode string
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)