我正在编写代码以在Node.js环境中通过HTTP/HTTPS读取任意Web资源,并希望在文本数据时将内容作为字符串返回,在二进制数据时将其作为缓冲区返回。
明显的是,任何以"text"开头的内容,例如"text/html",都是最好以字符串形式返回的文本数据 - 当然,需要使用适当的字符编码,这可能会被显式定义(例如"text/html; charset=utf-8"),或者可能不会。此外,任何对"charset"的显式定义都表示内容是文本而不是二进制,而与MIME类型无关。
就我所知,几乎所有其他内容都是二进制数据。我知道的所有音频和视频格式都是二进制的,几乎每种图像类型都是如此,除了"image/svg+xml"之外。似乎大多数"application/..."类型都是二进制的,但有一些值得注意的常见例外,例如"application/json"。
以下函数是否足以确定问题?如果不是,我可能忽略了哪些显著的例外情况?
明显的是,任何以"text"开头的内容,例如"text/html",都是最好以字符串形式返回的文本数据 - 当然,需要使用适当的字符编码,这可能会被显式定义(例如"text/html; charset=utf-8"),或者可能不会。此外,任何对"charset"的显式定义都表示内容是文本而不是二进制,而与MIME类型无关。
就我所知,几乎所有其他内容都是二进制数据。我知道的所有音频和视频格式都是二进制的,几乎每种图像类型都是如此,除了"image/svg+xml"之外。似乎大多数"application/..."类型都是二进制的,但有一些值得注意的常见例外,例如"application/json"。
以下函数是否足以确定问题?如果不是,我可能忽略了哪些显著的例外情况?
function isBinary(contentType: string): boolean {
let $: string[];
if (/;\s*charset\s*=/i.test(contentType))
return false;
// Remove anything other than MIME type.
contentType = contentType.replace(/;.*$/, '').trim();
if (/^text\//i.test(contentType) || /\+xml$/i.test(contentType))
return false;
else if (($ = /^application\/(.+)/i.exec(contentType)))
return !/^(javascript|ecmascript|json|ld\+json|rtf)$/i.test($[1]);
else
return true;
}