浏览器原理 · 28/51
1. addEventListener 第三个参数 2. addEventListener 与 attachEvent 区别 3. 浏览器兼容性测试与内核 4. 浏览器兼容性问题 5. 浏览器内核与引擎 6. 浏览器图层创建条件 7. 浏览器多进程架构 8. 浏览器渲染机制 9. 浏览器存储方案 10. 浏览器版本检测方法 11. children 与 childNodes 区别 12. 常见浏览器兼容性问题 13. Chrome 页面进程数量 14. 坐标系统对比 15. 多标签页通讯方案 16. 删除 Cookie 17. 自定义事件 18. DOM 事件处理方式演进 19. 元素尺寸属性对比 20. DOM 节点操作 21. DOM 事件机制 22. addEventListener 与 attachEvent 的区别 23. 获取页面所有复选框 24. HTMLCollection 与 NodeList 区别 25. Hybrid 应用开发 26. 强缓存命中机制 27. 浏览器缓存机制 28. 页面编码与资源编码不一致处理 29. jQuery 事件绑定方法对比 30. Input 点击触发的事件顺序 31. JavaScript 浏览器兼容性问题 32. jQuery 多事件绑定实现 33. JSBridge 原理 34. 链接点击后 Hover 失效解决方案 35. 减少重绘和回流的性能优化 36. 移动端 300ms 点击延迟问题 37. 移动端视口配置 38. 移动端点击穿透问题解决 39. 移动端兼容性问题 40. JSBridge 原理与实现 41. 移动端 1px 像素问题解决方案 42. 浏览器渲染流程 43. 页面加载完成事件对比 44. Offset、Scroll、Client 属性对比 45. 同源策略与跨域解决方案 46. Script 标签位置对页面加载的影响 47. Service Worker 与 PWA 48. 存储方案对比:Cookie、Storage、IndexedDB 49. 强缓存默认时间 50. URL 到页面显示的完整过程 51. V8 引擎 JavaScript 执行过程

页面编码与资源编码不一致处理

解决 HTML 页面与外部资源编码不一致导致的乱码问题

问题

当 HTML 页面使用一种字符编码(如 UTF-8),而引入的外部 JS、CSS 文件使用另一种编码(如 GBK)时,如何避免乱码?

解答

方法一:使用 charset 属性

<script> 标签上指定资源的编码:

<!-- 页面是 UTF-8,但 JS 文件是 GBK 编码 -->
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <!-- 通过 charset 属性声明外部脚本的编码 -->
  <script src="gbk-script.js" charset="GBK"></script>
</head>
<body>
</body>
</html>

方法二:服务器设置 Content-Type

服务器响应头中指定正确的编码,浏览器会优先使用响应头中的编码:

# Nginx 配置示例
location ~* \.js$ {
    charset GBK;
    # 或者
    add_header Content-Type "application/javascript; charset=GBK";
}
// Node.js 示例
const http = require('http');
const fs = require('fs');

http.createServer((req, res) => {
  if (req.url.endsWith('.js')) {
    // 设置响应头指定编码
    res.setHeader('Content-Type', 'application/javascript; charset=GBK');
    fs.createReadStream('./script.js').pipe(res);
  }
}).listen(3000);

方法三:统一编码(推荐)

最佳实践是将所有文件统一为 UTF-8 编码:

<!DOCTYPE html>
<html>
<head>
  <!-- 页面声明 UTF-8 -->
  <meta charset="UTF-8">
  <!-- 所有资源也使用 UTF-8,无需额外处理 -->
  <link rel="stylesheet" href="style.css">
  <script src="script.js"></script>
</head>
<body>
</body>
</html>

编码优先级

浏览器确定资源编码的优先级:

1. HTTP 响应头 Content-Type 中的 charset(最高)
2. <script> 或 <link> 标签的 charset 属性
3. 文件的 BOM(字节顺序标记)
4. 页面的编码声明(最低)

检测和转换编码

// 使用 TextDecoder 处理不同编码的数据
async function fetchWithEncoding(url, encoding = 'utf-8') {
  const response = await fetch(url);
  const buffer = await response.arrayBuffer();
  
  // 使用指定编码解码
  const decoder = new TextDecoder(encoding);
  return decoder.decode(buffer);
}

// 获取 GBK 编码的文件内容
fetchWithEncoding('/api/data', 'gbk').then(text => {
  console.log(text); // 正确显示中文
});

关键点

  • HTTP 响应头的 Content-Type: charset 优先级最高
  • <script charset="xxx"> 可指定外部脚本编码
  • 统一使用 UTF-8 是最佳实践,避免编码问题
  • TextDecoder API 可在前端处理不同编码的数据
  • CSS 文件可用 @charset "UTF-8"; 声明编码(需放在文件首行)