代码之家  ›  专栏  ›  技术社区  ›  lucas iezzi

当我在节点上使用不同的编码时,为什么输出是相同的。js使用fs。readFileSync()?

  •  0
  • lucas iezzi  · 技术社区  · 2 年前

    我试图理解为什么当我使用readFileSync方法并使用不同的编码(例如utf-8、十六进制、ascii)时,我在控制台上有相同的输出,而当我没有传递任何特定的编码时,我会收到utf-8格式的输出。

    我的意思是,如果我没有指定任何编码,我不应该接收文件格式(在本例中为.sol)上的文件信息吗?如果我指定utf-8格式,我不应该接收utf-8格式上的信息吗?

    我想我不太理解安可歌是如何运作的。

    const path = require('path');
    const fs = require('fs');
    const solc = require('solc')
    
    const inboxPath = path.resolve(__dirname, 'contracts', 'Inbox.sol');
    const source = fs.readFileSync(inboxPath, 'utf8');
    
    console.log(solc.compile(source, 1));
    
    0 回复  |  直到 2 年前
        1
  •  0
  •   jfriend00    2 年前

    当你这样称呼它:

    const source = fs.readFileSync(inboxPath, 'utf8');
    

    您正在将utf8编码传递给函数。它将从文件中读取数据,并对数据应用编码,以将其转换为字符串。

    如果你这样称呼它,没有编码:

    console.log(solc.compile(source, 1));
    

    它会给你一个缓冲区对象中的原始二进制数据,你会得到一些 console.log(source) )将如下所示:

    <Buffer 54 65 73 74 69 6e 67 20 4e 6f 64 65 2e 6a 73 20 72 65 61 64 46 69 6c 65 28 29>
    

    缓冲区数据的显示是每8位二进制数据显示一个十六进制值(为了方便我们查看)。这个 54 缓冲区的开头对应于字母 T 如果你把缓冲区转换成一个字符串 utf8 ascii 编码时,会得到一个以 T .

    如果数据都由字符代码小于128的字符组成,那么使用utf8和ascii编码对其进行解释会得到相同的结果。这是因为对于代码小于128的字符,utf8直接使用字符的代码。只有当字符代码高于128时,utf8才会开始为字符使用多个字节(实际上,它可以根据实际代码使用1-4个字节)。unicode中有1112064个代码点。由于在一个字节中只能表示256个唯一值,因此显然需要多个字节才能在unicode中表示所有1112064个代码点。当使用utf8时,这是一种可变长度编码,对于代码小于128的任何字符,每个字符使用一个字节,一旦代码超过128,它就会开始对这些字符使用多个字节。

    您的函数调用如下:

    安慰日志(solc.compile(源代码,1));
    

    很明显,他在等一个字符串 source 所以你必须给它一个字符串。如果您没有传递这样的编码:

    const source=fs。readFileSync(inbox路径,'utf8');
    

    然后 来源 是缓冲区对象(不是字符串)和 solc.compile(source, 1) 函数不喜欢这样,会给你一个错误。显然,您需要向该函数传递一个字符串。那么,你在问题中给出的代码是:

    const inboxPath = path.resolve(__dirname, 'contracts', 'Inbox.sol');
    const source = fs.readFileSync(inboxPath, 'utf8');
    
    console.log(solc.compile(source, 1));
    

    是从你的 fs.readFileSync() 然后把绳子传给 solc.compile() .