encoding-browser.browser.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import { getBOMEncoding } from './fallback/encoding.api.js'
  2. // Lite-weight version which re-exports existing implementations on browsers,
  3. // while still being aliased to the full impl in RN and Node.js
  4. // WARNING: Note that browsers have bugs (which hopefully will get fixed soon)
  5. const { TextDecoder, TextEncoder, TextDecoderStream, TextEncoderStream } = globalThis
  6. export { getBOMEncoding } from './fallback/encoding.api.js'
  7. export { TextDecoder, TextEncoder, TextDecoderStream, TextEncoderStream }
  8. export function normalizeEncoding(label) {
  9. if (label === 'utf-8' || label === 'utf8' || label === 'UTF-8' || label === 'UTF8') return 'utf-8'
  10. if (label === 'windows-1252' || label === 'ascii' || label === 'latin1') return 'windows-1252'
  11. if (/[^\w\t\n\f\r .:-]/i.test(label)) return null
  12. const l = `${label}`.trim().toLowerCase()
  13. try {
  14. return new TextDecoder(l).encoding
  15. } catch {}
  16. if (l === 'x-user-defined') return l
  17. if (
  18. l === 'replacement' ||
  19. l === 'csiso2022kr' ||
  20. l === 'hz-gb-2312' ||
  21. l === 'iso-2022-cn' ||
  22. l === 'iso-2022-cn-ext' ||
  23. l === 'iso-2022-kr'
  24. ) {
  25. return 'replacement'
  26. }
  27. return null
  28. }
  29. export function legacyHookDecode(input, fallbackEncoding = 'utf-8') {
  30. const enc = getBOMEncoding(input) ?? normalizeEncoding(fallbackEncoding)
  31. if (enc === 'replacement') return input.byteLength > 0 ? '\uFFFD' : ''
  32. return new TextDecoder(enc).decode(input)
  33. }
  34. export function labelToName(label) {
  35. const enc = normalizeEncoding(label)
  36. if (enc === 'utf-8') return 'UTF-8'
  37. if (!enc) return enc
  38. const p = enc.slice(0, 3)
  39. if (p === 'utf' || p === 'iso' || p === 'koi' || p === 'euc' || p === 'ibm' || p === 'gbk') {
  40. return enc.toUpperCase()
  41. }
  42. if (enc === 'big5') return 'Big5'
  43. if (enc === 'shift_jis') return 'Shift_JIS'
  44. return enc
  45. }