js,nodejs如何判断文件是啥编码格式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js,nodejs如何判断文件是啥编码格式相关的知识,希望对你有一定的参考价值。
参考技术A nodejs编码只支持utf8的编码方式,无论是打开某个文件或者写.js脚本都得以utf8的编码方式保存,不然程序无法运行,读出来的文件是乱码。如果是在前台,读取文件是通过FileReader或者FileReaderSync这两个webAPI和input[type='file']标签来配合来完成,但是这个两个API已经包涵了判断文件的编码方式的功能,无论是GBK还是utf8编码的文件都能正确打开不出现乱码,但是nodejs就会出现这样的问题,读取gbk和unicode编码的文件出现奇怪的乱码,有一个模块iconv-lite可以解决编码问题,但是前提是你得知道这个文件的编码方式,举个例子:
有一个gkb的文件叫gbk.txt正确查看它的方式如下:
var
icon=require('iconv-lite');
var
fs=require('fs')
fs.readFile('gbk.txt',function(err,buffer)
var
str=iconv.decode(buffer,'gbk')
console.log(str)//得到无乱码的内容
)
但是如果不知道文件的编码方式,那有该怎么办呢?
那就来聊一聊编码方式,首先UNICODE编码,UNICODE编码的文件无论内容是什么,前两个字节要不是FF
FE
或者
FE
FF,
utf-8头两个字节是EF
BB,至于gbk吧,目前我没找到判断方法,只能粗略的判断如果不是unicode和utf8就认为是GBK,
代码如下:
var
fs=require('fs')
fs.readFile('code.txt',function(err,buffer)
if(buffer[0]==0xff&&buffer[1]==0xfe)
console.log('unicode')
else
if(buffer[0]==0xfe&&buffer[1]==0xff)
console.log('unicode')
else
if(buffer[0]==0xef&&buffer[1]==0xbb)
console.log('utf8')
else
console.log('else')
)
nodejs中的`rc`文件是啥?
【中文标题】nodejs中的`rc`文件是啥?【英文标题】:What are `rc` files in nodejs?nodejs中的`rc`文件是什么? 【发布时间】:2016-07-12 18:08:33 【问题描述】:我对典型节点应用程序中的各种rc
文件有一些疑问,例如.npmrc
、.babelrc
等。
.[module]rc
命名约定还是只是推荐的格式?
支持哪些格式? yaml 和 json 格式我都见过,是不是依赖于模块使用的阅读器?
如何从模块的角度访问 rc 文件?将其命名为[module]rc
是否会使其自动可供模块使用?如果有,它将在哪里提供?
或者该模块是否应该像使用该模块的应用程序中的任何其他文件一样访问该文件,并期望它采用可理解的格式? (这是我现在正在做的,json格式)
我还看到有人需要package.json
来加载配置。推荐哪个,package.json
还是 rc 文件?
此外,它与 gulpfile.js
和 module.exports
这样的 JavaScript 文件有何不同? (我是说推荐的意思,当然知道js和rc文件的区别和优势)
每次我在 google 中搜索时,我都会找到 here 和 here,这是一个读取 rc 文件的工具,但没有解释它们是什么或它们是如何构造和/或连接到模块的。
任何见解都会非常有用。谢谢
【问题讨论】:
这些文件没有什么特别之处,不同的模块“只是碰巧”使用了类似的策略。 相关帖子 - What does the 'rc' in.bashrc
, etc. mean?
【参考方案1】:
所以首先,问得好。
rc
dotfiles 是配置文件,它们的用途、格式和整体含义可能会有所不同。您可以创建.[whatever name you like]rc
文件来通知您碰巧创建的任何包(假设另一个包不是在寻找同一个包)。通常,它们对于某种作用于您的源代码并且需要针对您的项目进行一些调整的工具很有用。我的理解是,过去几年在 UNIX 系统中曾有类似的文件发挥了重要作用,但这个想法已经停滞不前。
简而言之:
它们不是特定于节点的。 它们只是另一个文件 就格式而言,它们几乎可以是任何东西——这取决于您将使用什么来解析和读取它们。 YAML、JSON 和 ini 可能是最常见的(至少我见过)。 在大多数情况下,它们似乎遵循约定.[program or binary name]rc
package.json
文件可以包含适用于配置的外部元数据,这仅取决于您的项目是期望 .rc
文件还是期望它在 package.json
中(或两者兼而有之,如 babel 的情况)
另见:
What does "rc" mean in dot files http://www.faqs.org/docs/artu/ch10s03.html#ftn.id2941902 https://en.wikipedia.org/wiki/Configuration_file举个非常简单的例子:
假设您想阅读这个使用 JSON 编码的.foorc
文件:
"cool": true
你可以这样做:
'use strict';
const fs = require('fs');
fs.readFile('./.foorc', 'utf8', (err, data) =>
if (err) throw new Error(err);
console.log(JSON.parse(data));
)
有很多更好的方法可以做到这一点,但是您可以轻松编写自己的方法,也可以找到支持 YAML、ini 等解析并提供 API 的其他一些不错部分的包(例如, rc)
【讨论】:
所以包会像访问其他文件一样访问它吗?require('./.modulerc')
?
取决于“包”的含义,但是可以。我会用简单的例子来更新【参考方案2】:
不特定于Node或Babel,但*rc
文件一般是Unix系统中的配置文件
来自Wikipedia
配置文件也不仅仅只是修改设置,它们通常 (以 “rc 文件”的形式)在启动时运行一组命令(对于 例如,shell 的 "rc 文件" 可能会指示 shell 更改 目录、运行某些程序、删除或创建文件——很多 不涉及修改 shell 本身的变量的事情 所以不在shell的点文件中)。 该约定是从 CTSS 操作系统上的“runcom 文件”借用的。
此功能 可以并且已经扩展到解释程序编写的程序 配置文件实际上是另一个程序的语言 重写或扩展或自定义原始程序; Emacs 是 最突出的例子。
“rc 文件” 的“rc”命名约定受到上述“runcom”工具的启发,并且确实 不代表“资源配置”、“运行时配置”,或 “远程控制”经常被错误猜到。
"rc" 文件是传统上以 "(.)rc" 后缀和 其中包含用作配置的数据和信息 相关程序的信息。通常是那个名字 program 是 rc 文件名的第一部分,带有 "(.)rc" 用于指示文件用途的后缀,例如".xinitrc", ".vimrc", ".bashrc", "xsane.rc".
还有Runcom
Unix:来自 CTSS 系统 1962-63 上的 runcom 文件,通过启动脚本 /etc/rc
包含启动指令的脚本文件 应用程序(或整个操作系统),通常是文本 包含可能已调用的命令的文件 系统运行后手动执行但要执行 每次系统启动时自动进行。另见点文件。
换句话说,"rc" 只是在 60 年代遗留下来的东西,并且从那时起就经常用于各种程序的配置文件,包括 Node、Babel 和许多,还有很多其他的。
"rc" 文件没有什么特别之处,它们实际上可以包含任何类型的数据,没有规范或其他限制。
【讨论】:
嗯..所以这一切都取决于读者决定做什么,对吧?有什么推荐的访问方式吗? @GopikrishnaS - 作为 "*rc" 文件几乎可以是任何东西,javascript、JSON、纯文本、XML、YAML 或其他任何东西,你如何解析 文件完全取决于它包含的内容。【参考方案3】:RC 指
运行命令 运行时配置https://en.wikipedia.org/wiki/Run_commands
“rc”后缀可以追溯到 Unix 的祖父 CTSS。 它有一个名为“runcom”的命令脚本功能。早期的 Unix 使用“rc”作为操作系统的名称 启动脚本,作为对 CTSS runcom 的致敬。
【讨论】:
en.wikipedia.org/wiki/Run_command 中没有对“RC”、“runcom”或“CTSS”的引用 @wyu 您指的是错误的网址。Run_command
而不是 Run_commands
。 @rselvagenesh 给出了正确的网址。
@bala 答案中的网址是在我发表评论后编辑的
@wyu 好的。以上是关于js,nodejs如何判断文件是啥编码格式的主要内容,如果未能解决你的问题,请参考以下文章