5级.mat文件与utf - 8编码的字符数组R2020b加载失败

16个视图(30天)
我有一些麻烦在R2020a .mat文件加载,但不再R2020b负载。这似乎是由于一个utf - 8编码的字符串;一个小例子文件。如果可能的话,我想要utf - 8编码的字符串在R2020b .mat文件加载正确。
这些文件来自软件我们内部编写输出垫文件供以后分析,依照 由mathworks .mat文件规范 。示例文件包含字符串“测试°测试”,即。,“测试”+符号(U + 00 b0) +“测试”,在一个变量中“x”。所做的所有这些都是在Windows 1909 64位版本(18363.1379构建)。
在R2020a(版本= ' 9.8.0.1451342 (R2020a)更新5 ')负载(“test.mat”)为:
x =“测试°测试□”
最后一个字符是2字节squence E9FF(检查双(x(结束)))。在R2020b(版本= ' 9.9.0.1467703 (R2020b)”)负载(“test.mat”)为:
错误使用负载
不能读文件D: \ temp \ mexload_unicode \ bin \ test.mat。
显然R2020a也不是正确加载字符串——我不知道为什么有随机字节结束——但它负载,到现在为止对我们来说已经足够好(我们几乎从来没有非ascii数据)。
字节的十六进制编码的变量垫文件中的“x”是:
10 0 00 00 00 00 00 00 74 65 73 74 C2 B0 74 65 73 74 00 00 00 00 00 00
每后卫分为(1 - 5、1 - 6席文件规范):
  • 10 00 00 00 =(十进制)16日= miUTF8
  • 10 0 00 00 00 =(十进制)字节
  • 74 C2 B0 74 74 65 73 65 73 74…= utf - 8编码的测试°测试(C2 B0 =学位utf - 8) +填充一个64位的边界作为垫所需的文件格式
我们一直用这个软件,产生这些文件很长一段时间(因为~ R2012)只有R2020b,我们看到失败加载。我看过一些参考R2020b utf - 8的发行说明但没有足够详细有用甚至专门垫相关文件。通常谷歌所有的答案,但在这种情况下,我找不到任何一个相关的问题。
除了蒸馏问题上面的例子,我试过了:
  • 启用“β:全球语言支持使用Unicode utf - 8”选项的“区域”设置窗口10(重新启动),这使得没有区别万博1manbetx
  • 检查.mat文件由matlab -这些都似乎是utf - 16编码的,即使上述选项被选中,我不能找到一个方法来迫使utf - 8编码
  • 调整字段的字节数,以防matlab不算“C2B0”的“C2”,这只进一步损坏的字符串
使用utf - 16编码负载完全正确(没有虚假的字节,R2020a和R2020b),但是这需要两倍的空间——和我们的一些文件是足够大的/有足够的字符串的问题(当被加工在RAM中,不那么重要一旦压缩在磁盘上)。所以我想让utf - 8编码工作。
与上面的utf - 8编码有什么不对或垫文件的?或有任何更改的详细信息R2020a和R2020b之间关于utf - 8编码和mat文件加载?

接受的答案

拉塞尔伯吉斯
拉塞尔伯吉斯 2021年3月9日
我发现这个问题——看来matlab计算utf - 8字节数据元素大小延续而不是数组尺寸大小(这是有意义的,即使没有明确指出任何地方)。
更进一步的十六进制转储的测试。垫,分解:
(维数组子元素)
05年00 00 00 (miINT32)
08年00 00 00(8个字节)
01 00 00 00(1行)
10 0 00 00 00(列)
(数组名称的子元素)
01 00 1 00 78 00 00 00 (miINT8 1字节,“x”)
(数据元素)
10 00 00 00 (miUTF8)
0 00 00 00(10个字节)
74 C2 B0 74 74 65 73 65 73 74 00 00 00 00 00 00(测试°测试)
通过改变维数组的列数子元素从0到09年的数量(在“测试°测试”)完成utf - 8字符文件加载正确。大概是旧版本的matlab无视这种差异,在R2020b增加了检查。

更多的答案(0)

类别

找到更多的在功能帮助中心文件交换

s manbetx 845


释放

R2020b

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!