Microsoft Office Excel 中出现乱码,使用Notepad++ 修改文档编码格式 UTF-8 转化为 GB2312

1、现象

我在桌面上建立了一个简单的CSV文件“这是一个UTF-8文件.csv”

我同时使用Notepad++ 和 Microsoft Office Excel打开,显示的效果如下图:

我们可以看到,Notepad++可以正确识别(自动识别到的)到这是一个UTF-8的编码,可以正确使用UTF-8的编码模式打开。

而Microsoft Office Excel不能正确识别到UTF-8编码,导致识别乱码。因为:Excel的实际编码行为,依赖于系统的语言版本、用户设置以及文件的保存选项。在同样的环境下,我们Global Helpdesk同事的英文版系统,安装的英文版本Microsoft Office 打开这个 UTF-8 文档就不会乱码。

具体的情况矩阵图是这样的。

团队 操作系统 Microsoft Office安装版本 打开UTF-8编码文件 打开GB2312编码文件
Global Helpdesk 英文 Windows系统 英文版本 Microsoft Office 不乱码 乱码
CN Helpdesk 中文 Windows系统 中文版本 Microsoft Office 乱码 不乱码

其实这种问题早在互联网早期,没有UTF-8的时代就屡见不鲜了,我之前文章就有提到过这个编码问题,可以参考。

同样的应用(Microsoft Office Excel),对应的默认打开编码不同。

2、原理

知识1:不同的操作系统,拥有不同的默认编码值(ANSI Code Page)

那为什么会提到操作系统,因为这里有一些底层原理。

  1. 英文版的Windows系统上,默认的ANSI代码页是Windows-1252
  2. 中文版的Windows系统上,默认的ANSI代码页是GB2312

Microsoft Office的安装包本身并不直接决定其应用程序内部处理文本时采用的默认编码(这里说的是不同语言版本的Office安装包)。不过,Office应用程序(如Word、Excel等)在处理已存在的文本文件时,倾向于遵循使用操作系统的区域设置和编码偏好。也就是Windows注册表中的ACP的值(ANSI Code Page)HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage

因此,很多像Microsoft Office这样不能自动识别到程序如果未特别指定

  1. 英文版的Windows系统上Office应用程序在保存或打开未指定编码的文档时,会以Windows-1252编码打开
  2. 中文版的Windows系统上Office应用程序在保存或打开未指定编码的文档时,会以GB2312编码打开
  3. 但是,对于新建的文档,现代版本的Microsoft Office(如Office 2010及以后)更倾向于内部使用Unicode(UTF-16)进行存储,以确保广泛的字符兼容性。

因此,我们需要将文件编码进行转化,才能解决这样的问题。(当然你用WPS,就可以无忧从容面对。谁让雷布斯最懂中国人呢?)其实WPS是求伯君写的。

 


知识2:Windows系统是如何区分ANSI背后的真实编码的呢?

微软用一个叫“Windows code pages”(在cmd命令行下执行chcp命令可以查看当前code page的值)的值来判断系统默认编码,比如:

简体中文的code page值为936(表示GB2312),繁体中文的code page值为950(表示Big-5编码)。

chcp 是 "change code page" 的缩写,用于显示或设置控制台窗口使用的字符编码的命令。

 


知识3:我们能否通过修改Windows code pages的值来改变“ANSI编码”呢?

临时修改:

命令提示符下,我们可以通过chcp命令来修改当前终端的active code page,例如:

(1) 执行:chcp 1252,code page 改为 1252,
Windows-1252是一种扩展的ASCII字符集,主要适用于西欧语言,包括英语。它是IBM PC兼容机上DOS和Windows操作系统中ANSI代码页的常见实现,用于替代ISO 8859-1(Latin-1)字符集。(汉字就成乱码了);

(2) 执行:chcp 936,code page 改为 936。

上面的操作只在当前终端起作用,并不会影响系统默认的“ANSI编码”。当我们进入cmd窗口后,直接输入“chcp 1252”回车后,只会临时修改当前窗口的活动代码页,当再次进入后又会显示之前的页码页。

CMD终端查看编码:鼠标放在终端“命令提示符”旁边白色条部分 --> 右键点击属性-->看到当前代码页为 936(ANSI/OEM- 简体中文 GBK)——中文版Windows系统默认编码

更改为英文1252(ANSI - 拉丁语 I)——英文版Windows系统默认编码

更改为65001(UTF-8)——Windows系统没有 默认编码为UTF-8的编码。非必需,没必要改成这个UTF-8,代码开发的人员或者外交、大使馆等人员,可能会改成这个。(各国邮件、文件往来)


永久修改:

控制面板可以永久修改(code page)系统默认的“ANSI编码”

Windows下code page是根据当前系统区域(locale)来设置的,要想修改系统默认的“ANSI编码”,我们可以通过修改系统区域来实现(“控制面板” =>“时钟、语言和区域”=>“区域和语言”=>“管理”=>“更改系统区域设置...”):

以下是中文系统(GB2312——code page 936)、英文系统(Windows-1252——code page 1252)切换的方法示例:

注意其中如果勾选了“使用UTF-8提供全球语言支持code page 65001VS等IDE会自动通过UTF-8(无签名)的编码加载文件,保存同理,会导致中文系统下的GB2312编码的文件产生中文乱码,需要通过其他方式将文件格式进行转换后再加载! 但可以从源头解决开发人员任务分工时各个同事间提交文件编码格式不统一导致的乱码问题。代码开发的人员或者外交、大使馆等人员,可能会改成这个。(各国邮件、文件往来)

注册表永久修改:

你还可以通过修改注册表,分别设置你所需的

请注意,这种方法可能不会直接影响所有应用程序的行为,因为许多现代应用会根据自身需求动态选择编码(就像Notepad++、国产WPS等都可以做到)或者应用内允许用户手动设置编码(Xshell、SecureCRT、大部分的开发应用等)。

操作步骤:

  1. 备份注册表:在开始之前,使用regedit打开注册表编辑器,然后导航到你打算修改的位置,右键点击相应的键选择“导出”,保存一个备份副本。

  2. 打开注册表编辑器:按下Win + R组合键打开“运行”对话框,输入regedit并按回车键,以管理员身份运行注册表编辑器。

  3. 定位到代码页设置:导航至以下位置:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage

  4. 修改默认代码页:在CodePage项下,有两个常见的键值可能与代码页设置有关:

    • ACP(ANSI Code Page):影响非Unicode程序的默认多字节代码页。
    • OEMCP(Original Equipment Manufacturer Code Page):影响命令提示符等使用OEM字符集的环境。

    根据你的需求,双击你想要修改的键值(例如,如果你想改变ANSI代码页,就双击ACP),在“数值数据”框中输入新的代码页值,如1252代表Windows-1252。确保基数选择为十进制,然后点击“确定”。

  5. 重启计算机:修改注册表后,为了使更改生效,通常需要重启计算机。

MS-DOS为以下国家和语言提供字符集:

代码页 描述

1258 越南语

1257 波罗的语

1256 阿拉伯语

1255 希伯来语

1254 土耳其语

1253 希腊语

1252 拉丁 1 字符 (ANSI)

1251 西里尔语

1250 中欧语言

950 繁体中文

949 朝鲜语

936 简体中文

932 日语

874 泰国语

850 多语种 (MS-DOS Latin1)

437 MS-DOS 美国英语

 


3、编码转化方法

原理都说通了,我这才能把除解决方法说清除。

1、卸载Microsoft Office、安装WPS(一劳永逸)

2、使用 Notepad++ 进行编码转化,这个要有前提的(中文版Windows系统)。

因为国内用户(基本上看我这个文章的人,应该都会安装中文版Windows系统吧)

那么,我们就可以直接转化了,

  1. 用Notepad++打开乱码文件
  2. 点击“编码”——转为“ANSI编码”——保存
  3. 最后用Excel打开,中文被正确识别。
  4. 用Notepad++编辑打开,可以看到被正确识别为“GB2312”

过程如图:

这里需要稍作解释,这里使用了Notepad++ 中的编码转化。但是选择的是“转为ANSI编码”

因为:我安装的是中文Windows系统,所以这个ANSI系统编码就是GB2312。(这种转码反向操作也可以)

如果我安装的是英文Windows操作系统,那么我用Office打开UTF-8文件本身就不会乱码。

posted @ 2024-06-19 10:46  Magiclala  阅读(1128)  评论(0编辑  收藏  举报