如何在 Matlab 中启用 UTF-8 编码

文章目录

  • 定位问题
  • 为什么应该使用 UTF-8
  • 怎么让 Matlab 使用 UTF-8
  • 一点吐槽

【注意】最后更新于 October 12, 2020,文中内容可能已过时,请谨慎使用。

今天遇到了 Matlab 的中文编码问题,经过查询之后发现应该有许多人遇到了这个问题,可是网上能查到的相关文章只是抛出莫名其妙的解决方案,几乎都没有任何分析。在此我详细地分析了这个问题,以及其解决方案。

大概两三周前,我在中文 Windows 10 上的 Matlab 中打开一份之前在 Linux 上写的 Matlab 代码,发现其中的中文居然全部成了乱码,那时我以为是 Windows 和 Linux 操作系统之间字符编码的问题,就没太在意。今天,我发现我在 Visual Studio Code 中写 Matlab 代码时,mlint.exe 程序(即 Matlab 的自动纠错程序)给出的 Warning 信息全都是乱码;而用 Matlab 打开同一份代码,代码中的中文也变成了乱码。此时我就意识到,这个问题值得探索了。

定位问题

同一个文件在同一个操作系统上的不同程序中显示出不同的面貌,说明一定是字符编码出了问题。我心里的第一个想法就是「现在不是全宇宙通用 UTF-8 编码吗?难不成是 Matlab 还在使用其它编码方式?」。在确认了 VS Code 使用的是 UTF-8 之后(VS Code 的界面右下角会显示使用的编码方式。毕竟它是文本编辑器嘛!),我就明白了,一定是 Matlab 在用什么小众的编码方式。

网上很容易搜到,在 Matlab 的命令行中可以使用 feature('locale') 命令来查看当前的编码方式。我的结果如下:

feature(‘locale’) 的输出结果

可以看到,默认的编码方式,果然基本都是 GBK,真的是害人。我用的已经是 Matlab 的 R2019a 版本了,居然还默认使用 GBK 编码,这是多么顽固?

为什么应该使用 UTF-8

由于编码问题产生的麻烦和乱码,相信你也遇到过不少。要解决这个问题的一个重要方式,就是统一地球上的所有编码方式,让尽可能所有的程序都使用某一种编码方式。这就是 Unicode 和 UTF 编码诞生的理由。Unicode 字符集几乎包含了所有可以使用计算机来显示的字符,而 UTF 系列编码则是对这一字符集的编码。UTF 编码有 UTF-8,UTF-16,UTF-32 等等,而 UTF-8 是其中最通用、占用存储空间相对较少的一种。

要让乱码不再产生,要么就都让 Matlab 和 VS Code 都使用 UTF-8,要么就让 Matlab 和 VS Code 都使用 GBK。但是 GBK 是专用于中文的编码方式,并不通用,让程序强制使用 GBK,可能会解决一个问题,却带来更多问题。从长远看,“everything UTF-8” 才是好的解决方案。

怎么让 Matlab 使用 UTF-8

如果你搜索 Matlab 的文档,文档会告诉你,使用 slCharacterEncoding() 函数来设置字符编码,那就试试它。

如果不带参数地运行这一函数,会显示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lmJxvAj7-1630512563359)(https://i.loli.net/2020/07/21/cSfHXaWwQipDsBR.png)]

输出结果

果然是 GBK。那我把它改掉呢?但是事实是,改不掉。即使输入 slCharacterEncoding('UTF-8') 之后,在输入 slCharacterEncoding() 的结果已经变成了 ‘UTF-8’,文件还是会乱码。哪怕重启 Matlab,也会乱码。所以说,官方文档没用。

真正解决问题的是网上的另外一些文章,虽然它们都没说为什么,但是我大概能理解为什么那么做。首先,打开 Matlab 安装目录下的 bin 目录,对我来说,这个目录的路径是

D:\Program Files\MATLAB\R2019a\bin

在此目录下,会有两个文件,lcdata.xmllcdata_utf8.xml。其中 lcdata.xml 决定了 Matlab 的编码方式,而 lcdata_utf8.xml 似乎是一个不生效,但是专门用来替代 lcdata.xml 的文件。

首先,把 lcdata.xml 重命名为 lcdata_old.xml,即把它备份一份,防止以后要用到。

然后,把 lcdata_utf8.xml 复制一份,就叫做 lcdata.xml,并且打开它,作出一些改动。首先要删掉关于 GBK 的这一部分:

<encoding name="GBK'><encoding_alias name="936"/>
</encoding>

然后,改动一下关于 UTF-8 的部分,高亮的那一行是新加入的内容:

<encoding name="UTF-8"><encoding_alias name="utf8"/><encoding_alias name="GBK"/>
</encoding>

这么做的目的就是,将 GBK 编码从一种独立的编码方式,改成了 UTF-8 的一个别名,从而欺骗 Matlab,让它使用 UTF-8。虽然很不优雅,但是真的有用。

重启 Matlab 之后,乱码的中文应该就不再乱码了。

一点吐槽

在写下这篇文章之后,关于 Matlab 编码问题的折腾还没有结束,因为当我使用 VS Code 编写 Matlab 程序时,mlint.exe 程序仍然输出乱码,错误信息也没法用。

不可能选择屈从于 GBK 编码,否则哪天我在 Linux 上看 Matlab 程序又没法看了。GBK 绝对是一个已经过时了的、没有前途的、故步自封的编码选择。

我现在想尝试的是,使用第三方编辑器(例如 VS Code,我更看好 Emacs)来编写 Matlab 源文件,存储为 UTF-8 格式,使用 mlint.exe 进行代码检查,并且使用集成的 Matlab Terminal 进行即时的运行。这就做好比是把 VS Code(或者 Emacs)变成了 Matlab 的第三方客户端。

既然有 Matlab,为什么还要用第三方客户端?还不是因为 Matlab 太令人不满意了。一个付费商用科学计算软件,不能改字体和主题,编码方式写死在代码里,编程规则各种特立独行,真的让人很难喜欢起来。

本文转自 https://blog.ericzhuochen.com/post/matlab-utf8/,如有侵权,请联系删除。

如何在 Matlab 中启用 UTF-8 编码相关推荐

  1. matlab 对话框保持,如何在matlab中创建输入对话框?(How to create Input dialog box in matlab?)...

    如何在matlab中创建输入对话框?(How to create Input dialog box in matlab?) 我想在matlab中创建输入对话框. 我在MATLAB中执行简单的加法运算. ...

  2. 如何在.NET中启用程序集绑定失败日志记录(Fusion)

    如何在.NET中启用程序集绑定失败日志记录(Fusion)? #1楼 如果您已经启用了日志记录,并且在Windows 7 64位上仍然出现此错误,请在IIS 7.5中尝试: 创建一个新的应用程序池 转 ...

  3. 如何在MATLAB中调用(运行)“用Python写成的函数或脚本”

    如何在MATLAB中调用"用Python写成的函数或脚本",首先要确保MATLAB知道咱们的Python解释器的位置在哪里. 如果安装了Python的时候把Python加入了系统环 ...

  4. matlab中拟合函数中的gian值,如何在Matlab中优化基本周期图法对随机信号进行的功率谱估计...

    首都师范大学学报(自然科学版)第27卷 第5期2006年10月 Journal of Capital N ormal University (Natural Science Edition ) V o ...

  5. matlab矩阵指定行最大值,求Matlab程序:在2行矩阵中,如何求第1行最大值和第2行相应的最大,请问,如何在MATLAB中编写程序实现求两矩阵A*B,A.*...

    导航:网站首页 > 求Matlab程序:在2行矩阵中,如何求第1行最大值和第2行相应的最大,请问,如何在MATLAB中编写程序实现求两矩阵A*B,A.* 求Matlab程序:在2行矩阵中,如何求 ...

  6. 二次函数 用matlab,这个二次函数如何在MATLAB中拟合出来?

    这个二次函数如何在MATLAB中拟合出来? 关注:278  答案:2  手机版 解决时间 2021-01-15 20:02 提问者夕阳再美ソ也会落幕 2021-01-15 17:12 (q+1/1.1 ...

  7. w10睡眠的计算机如何启动,如何在Windows10中启用或禁用允许混合睡眠

    如何在Windows10中启用或禁用允许混合睡眠 启用或禁用Windows10中允许混合睡眠的方法 在转到"允许混合睡眠"选项之前,我们将尝试了解什么是睡眠的基本术语?当用户希望离 ...

  8. matlab中10的负几次方怎么表示,matlab中e负2次方 数学中2e-01T表示什么含义,如何在MATLAB中实现?...

    数学中2e-01T表示什么含义,如何在MATLAB中实现? 这个简单啊,就是E是弹模,v是泊松比,2.63e-2指的是2.63乘以10的-2次方,T估计指的是温度吧 请问matlab里面exp函数怎么 ...

  9. matlab 创建 符号矩阵,如何在MATLAB中动态创建符号矩阵?

    我需要在MATLAB中创建一个符号矩阵.它可以静态地完成为如何在MATLAB中动态创建符号矩阵? syms a11 a12 a21 a22; A = [a11 a12; a21 a22]; 或使用紧凑 ...

最新文章

  1. 21岁华人本科生,凭什么拿下CVPR 2020最佳论文提名?
  2. 50位青年科学家获颁1.5亿大奖!3位大咖这样寄语
  3. ConnectivityManager详解
  4. Linux系统root密码重置教程
  5. 网易2020校招笔试编程题回顾
  6. PPT 2016的加解密功能
  7. 手动搭建一个Spring Boot项目
  8. 医学图像处理期末复习(三)
  9. Web应用架构-Full-text Search Service
  10. aop阻止方法运行_新型AOP高级氧化高浓度COD废水处理系统介绍
  11. 全新精美UI口红机闯三关赢礼品源码
  12. Spring Cloud Bus 消息总线实现配置自动刷新
  13. hanlp源码解析之中文分词算法
  14. mysql分组查询 having,MYSQL-分组查询-where和having的区别
  15. centos搭建NFS服务器
  16. 【深度】注册测绘师执业制度实施的现状分析
  17. 打印机驱动兼容问题导致打印乱码
  18. 简体和繁体之间的转换
  19. 数组元素循环左移n个位置(JAVA)
  20. mmsegmentation教程2:如何修改loss函数、指定训练策略、修改评价指标、指定iterators进行val指标输出

热门文章

  1. linux应用程序固件升级,一种多设备同步烧录Linux固件及应用程序的方法与流程...
  2. 淘宝双主图技术解析(附工具包)
  3. 对3721上网助手的一些疑问建议
  4. 获取时间对象Can not parse date while it seems to fit format ‘yyyy-MM-dd‘T‘HH:mm:ss.SSS
  5. Mac打不开后缀名为txt文件,显示文本编码中文不适用的解决措施
  6. 如何用计算机管理员权限,计算机管理员权限如何获得【图解】
  7. ACTIVEPERL 5.10无法ppm安装
  8. 数据分析04-朴素贝叶斯
  9. 蓝桥杯历年真题,来,看看
  10. 010Edit分析 爆破 + 算法逆向 + 注册机编写