如何从编码的 base64 UTF 字符串中删除 BOM?

How to remove BOM from an encoded base64 UTF string?

我有一个在 MacOS 命令行中使用 openssl base64 -in en -out en1 以 base64 编码的文件,我正在使用以下代码读取此文件:

string fileContent = File.ReadAllText(Path.Combine(AppContext.BaseDirectory, MConst.BASE_DIR, "en1"));
var b1 = Convert.FromBase64String(fileContent);
var str1 = System.Text.Encoding.UTF8.GetString(b1);

我得到的字符串在实际文件内容之前有一个 ?。我不确定是什么原因造成的,如有任何帮助,我们将不胜感激。

示例输入:

import pandas
import json

编码文件示例:

77u/DQppbXBvcnQgY29ubmVjdG9yX2FwaQ0KaW1wb3J0IGpzb24NCg0K

基于 C# 代码的输出:

?import pandas
import json

通常,当您从文本文件中读取 UTF(带 BOM)时,系统会在后台为您处理解码。例如,无论文本文件是否具有 BOM,以下两行都将正确读取 UTF 文本:

File.ReadAllText(path, Encoding.UTF8);
File.ReadAllText(path); // UTF8 is the default.

问题是您正在处理已编码为 Base64 字符串的 UTF 文本。因此,ReadAllText() 无法再为您处理 BOM。您可以通过(检查并)从字节数组中删除前 3 个字节来自己完成,也可以将该作业委托给 StreamReader,which is exactly what ReadAllText() does:

var bytes = Convert.FromBase64String(fileContent);
string finalString = null;

using (var ms = new MemoryStream(bytes))
using (var reader = new StreamReader(ms))  // Or:
// using (var reader = new StreamReader(ms, Encoding.UTF8))
{
    finalString = reader.ReadToEnd();
}
// Proceed to using finalString.