|
| 1 | +import * as iconv from 'iconv-lite' |
| 2 | + |
1 | 3 | import { HOST } from '@/utils/env' |
| 4 | +import { ENCODING_OPTIONS } from '@/utils/option' |
2 | 5 |
|
3 | 6 | export const getFileName = (v: string) => v.split('/').pop() || '' |
4 | 7 |
|
@@ -42,7 +45,48 @@ export const getKey = (path: string) => |
42 | 45 | .join('-') |
43 | 46 | .replace(/\./g, '_') |
44 | 47 |
|
45 | | -export async function isBinaryContent(blob: Blob) { |
| 48 | +export const getEncodeValue = async (blob: Blob) => { |
| 49 | + const result = { encode: '', value: '' } |
| 50 | + |
| 51 | + const buffer = new Uint8Array(await blob.arrayBuffer()) |
| 52 | + |
| 53 | + if (buffer.length >= 3 && buffer[0] === 0xef && buffer[1] === 0xbb && buffer[2] === 0xbf) { |
| 54 | + result.encode = 'utf8' |
| 55 | + } else if (buffer[0] === 0xfe && buffer[1] === 0xff) { |
| 56 | + result.encode = 'utf16be' |
| 57 | + } else if (buffer[0] === 0xff && buffer[1] === 0xfe) { |
| 58 | + result.encode = 'utf16le' |
| 59 | + } |
| 60 | + |
| 61 | + if (!result.encode) { |
| 62 | + for (const item of ENCODING_OPTIONS) { |
| 63 | + try { |
| 64 | + const text = iconv.decode(buffer, item.value) |
| 65 | + const sum = text.length |
| 66 | + const err = text.split('').filter((i) => i === '�').length |
| 67 | + |
| 68 | + if (err / sum > 0.3) { |
| 69 | + result.encode = item.value |
| 70 | + result.value = text |
| 71 | + } |
| 72 | + } catch { |
| 73 | + continue |
| 74 | + } |
| 75 | + } |
| 76 | + } |
| 77 | + |
| 78 | + if (!result.encode) { |
| 79 | + result.encode = 'utf8' |
| 80 | + } |
| 81 | + |
| 82 | + if (!result.value) { |
| 83 | + result.value = iconv.decode(buffer, result.encode) |
| 84 | + } |
| 85 | + |
| 86 | + return result |
| 87 | +} |
| 88 | + |
| 89 | +export const isBinaryContent = async (blob: Blob) => { |
46 | 90 | const slice = blob.slice(0, 1024) |
47 | 91 | const arrayBuffer = await slice.arrayBuffer() |
48 | 92 | const bytes = new Uint8Array(arrayBuffer) |
|
0 commit comments