<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Windows on Thouser的技术博客</title>
    <link>https://thouser.pages.dev/tags/windows/</link>
    <description>Recent content in Windows on Thouser的技术博客</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Tue, 04 Aug 2026 10:30:00 +0800</lastBuildDate>
    <atom:link href="https://thouser.pages.dev/tags/windows/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>UTF-8 与 GBK 编码详解：从乱码到 Windows 代码页</title>
      <link>https://thouser.pages.dev/post/utf-8%E4%B8%8Egbk%E7%BC%96%E7%A0%81%E8%AF%A6%E8%A7%A3/</link>
      <pubDate>Tue, 04 Aug 2026 10:30:00 +0800</pubDate>
      <guid>https://thouser.pages.dev/post/utf-8%E4%B8%8Egbk%E7%BC%96%E7%A0%81%E8%AF%A6%E8%A7%A3/</guid>
      <description>&lt;h1 id=&#34;utf-8-与-gbk-编码详解从乱码到-windows-代码页&#34;&gt;UTF-8 与 GBK 编码详解：从乱码到 Windows 代码页&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;起因：一次 &lt;code&gt;hermes update&lt;/code&gt; 脚本报错，&lt;code&gt;.cmd&lt;/code&gt; 文件里全是 &lt;code&gt;&#39;慨澶嶉噸鏀?&#39; 不是内部或外部命令&lt;/code&gt; 这样的乱码。排查后发现是 &lt;strong&gt;UTF-8 编码的文件被 cmd.exe 按 GBK 解析&lt;/strong&gt; 导致的。这篇文章把这次踩坑学到的编码知识完整总结下来。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一先分清两个概念字符集-vs-编码&#34;&gt;一、先分清两个概念：字符集 vs 编码&lt;/h2&gt;
&lt;p&gt;很多人把这两个概念混在一起说，其实这是两层：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;概念&lt;/th&gt;
          &lt;th&gt;回答什么问题&lt;/th&gt;
          &lt;th&gt;例子&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;字符集 (Charset)&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&amp;ldquo;中&amp;quot;这个字排第几号？&lt;/td&gt;
          &lt;td&gt;Unicode 里&amp;quot;中&amp;quot;是&lt;strong&gt;U+4E2D&lt;/strong&gt;；GBK 里它是 &lt;strong&gt;0xD6D0&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;编码 (Encoding)&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;这个编号怎么存成字节？&lt;/td&gt;
          &lt;td&gt;U+4E2D 存成 3 字节&lt;code&gt;E4 B8 AD&lt;/code&gt;（UTF-8）或 2 字节 &lt;code&gt;D6 D0&lt;/code&gt;（GBK）&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;中&amp;quot;还是那个&amp;quot;中&amp;rdquo;，只是两套系统给它编了不同的号、用不同的方式存储。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;文件里存的永远是&lt;strong&gt;字节&lt;/strong&gt;，读文件时必须知道&amp;quot;按哪套规则解释这些字节&amp;rdquo;——这就是编码的由来。&lt;/p&gt;
&lt;p&gt;我的理解是：字符集就像字典，收录字符并给出一个唯一标志，编码就是把这个标志转换为字节表示&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二gbk中文世界的老编码&#34;&gt;二、GBK：中文世界的老编码&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;中国国家标准，从 GB2312 扩展而来，是 &lt;strong&gt;1990 年代 ~ 2010 年代中文电脑的默认编码&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;汉字 &lt;strong&gt;2 字节&lt;/strong&gt;，ASCII 字符 1 字节&lt;/li&gt;
&lt;li&gt;只覆盖&lt;strong&gt;中文 + ASCII&lt;/strong&gt;（及少量日文假名、朝鲜文等），不认识其他文字&lt;/li&gt;
&lt;li&gt;优点：中文省 1/3 空间；是中文 Windows 的&lt;strong&gt;原生&lt;/strong&gt;编码（代码页 CP936）&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;三utf-8全世界的通用语&#34;&gt;三、UTF-8：全世界的通用语&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;是 &lt;strong&gt;Unicode 字符集&lt;/strong&gt;的一种编码实现，目标是把&lt;strong&gt;全人类所有文字&lt;/strong&gt;统一编号&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;变长编码&lt;/strong&gt;：ASCII 1 字节、欧洲文字 2 字节、&lt;strong&gt;中文 3 字节&lt;/strong&gt;、生僻字 4 字节&lt;/li&gt;
&lt;li&gt;关键设计：&lt;strong&gt;完全兼容 ASCII&lt;/strong&gt;——任何一个 ASCII 文本文件，字节不变就是合法的 UTF-8 文件&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;这就是&amp;quot;UTF-8 最兼容&amp;quot;的真正含义：它不是&amp;quot;和所有编码兼容&amp;quot;，而是&lt;strong&gt;它本身就是国际标准，任何现代系统都按它解释&lt;/strong&gt;。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
