如何从nodejs缓冲区中删除非法字符?

时间:2017-03-11 07:49:48

标签: javascript node.js

我从前端获得了一个base64编码的csv文件字符串。在后端我将base64字符串转换为二进制,然后尝试将其转换为json对象。

 var csvDcaData = new Buffer(source, 'base64').toString('binary')//convert base64 to binary

问题是,Ui正在发送一些非法字符,这些字符在字段上是普通csv中用户不可见的。 “”这些是附加在csv字段之一的字符。

我想从base64中的数据中删除这些字符但我无法在缓冲区中识别它们,转换后会出现这些字符。

可以以任何方式从缓冲区中检测此类字符。

1 个答案:

答案 0 :(得分:3)

来源正在向您发送消息。该消息由元数据和文本组成。消息的前几个字节可以识别为元数据,因为它们是以UTF-8编码的字节顺序标记(BOM)。这强烈暗示文本以UTF-8编码。尽管如此,要阅读文本,您应该从发件人那里找到使用的编码。

是的,当想要仅处理文本时,应删除BOM“字符”。它们不是字符,因为它们不是文本的一部分。 (但是,如果将字节解码为UTF-8,则它与代码点U + FEFF匹配。)

因此,尽管可能是深奥的,但该消息不包含非法字符,但实际上具有有用的元数据。

另外,鉴于您没有剥离BOM,您看到“”而不是“”(U + FEFF ZERO WIDTH NO-BREAK SPACE)意味着您没有使用UTF- 8解码文本。这可能会导致数据丢失。没有文字而是编码文本。您始终必须知道并使用正确的编码。

现在,source是一个JavaScript字符串(顺便说一下,它使用Unicode的UTF-16编码)。字符串的内容是以Base64编码的消息。消息是一个字节序列,它是BOM和文本的UTF-8编码。您希望JavaScript字符串中的文本。 (并且文本恰好是某种形式的CSV。为此,您需要知道行结尾,分隔符和文本限定符。)您和发件人可以谈论很多内容。也许发件人记录了这一切。

const stripBom = require('strip-bom');

const original = "¡You win one million ₹! Now you can get a real ";
const base64String = Buffer.from("\u{FEFF}" + original, "utf-8").toString("base64");
console.log(base64String);

const decodedString = 
    stripBom(Buffer.from(base64String, "base64").toString("utf-8"));

console.log(decodedString);
console.log(original === decodedString);