罗兰在MATLAB的艺术

把想法变成MATLAB

请注意

罗兰在MATLAB的艺术已经存档,不会被更新。

处理低水平文件I / O和编码

我很高兴介绍瓦迪姆Teverovsky,本周我们的客人的博主,他给了我们承担MATLAB低水平文件I / O和它是如何工作的编码。

它是相当常见的用户读写不7位ASCII字符数据的字符(参见ASCII维基)。这些角色可能包括字符从除英语之外的其他语言和各种符号字符,如井号。不幸的是,用户可能会遇到麻烦,当这些文件在共享平台或语言的界限。为了能够可靠地读和写这样的数据,用户应该知道有些事情。

内容

常见问题1:平台差异

从R2006a开始,MATLAB文件IO的低水平,,采取“角色”指的是一个实际的字符而不是一个“单一字节”,它经常被过去的情况。在今天的多语言环境中,这是必要的。

为了了解MATLAB写入和读取,我们需要理解的概念“编码”。一个编码是一种代表特定的符号,如字母或数字,语言和特定的场所。7位ASCII编码的一个例子,很多人都很熟悉。另一个例子是shift - jis,这是常用的在日本。然而其他人包括windows - 1252和iso - 8859 - 1,这都是稍微不同的变异通常被称为扩展ASCII。每台计算机(用户)通常会有一个缺省语言环境。因此,用户运行Windows在美国通常是运行在Windows - 1252编码。如果语言环境改变,编码可能会改变。通常,您可能遇到的所有的默认编码的ASCII值集的共同点,但在那之后,一切都不一样了。

MATLAB,除非你指定一个特定的编码(稍后详细介绍),将使用计算机的用户的默认编码。因此,当你在Windows计算机在纳蒂克,马萨诸塞州,您可以编写下面的代码:

fid = fopen (“sample1.txt”,' w ',“l”);写入文件(fid检测器,英语字母的,“字符”);文件关闭(fid);

结果将是一个文件写在windows - 1252编码。再次读取这个文件时,假设你仍然运行在同一环境,同一台机器MATLAB将知道如何编码的数据转化为内部表示,并将正确地读取字符。

类型(“sample1.txt”);
英语字母

但是如果你在Windows文件写出来,并试着读它在Solaris的机器。好吧,事实证明,Solaris,作为默认,7位ASCII编码的,不能代表所有的符号在windows - 1252编码。只要你坚持的ASCII字符(值< = 127),一切看起来完全一样。但如果你试着写出来,读一英镑符号(163在windows - 1252) ?

char (163)
ans =£

价值不属于7位ASCII编码,因此将不会读在Solaris计算机的成功。它可能会体现为ASCII值26日,即“我不知道”。该文件包含什么?现在,相信我提供最后一个参数打开外部文件下面将导致一个文件非常类似于Solaris:你会看到什么

fid = fopen (“sample2.txt”,' w ',“l”,“us - ascii”);写入文件(fid检测器,“英语字母£¥§©”,“字符”);文件关闭(fid);类型(“sample2.txt”);
英语字母

发生了什么事?的奇怪的看字符对应于非ASCII字符没有得到正确写出,因为MATLAB试图将它们转换为us - ASCII,不能这么做。

同样,如果你是在日本,工作在电脑上设置为一个日本环境,和写一个文件,你希望能够读取一个德国环境机器吗?同样的问题会发生,因为默认编码是不同的。

常见的问题# 2:文件来自外部源

这种问题的另一个表现是这样的数据:

fid = fopen (“sample3.txt”,“r”,“l”);str = fscanf (fid,' % s 'abs (str)文件关闭(fid);
str = yþa b c d f e g h ans =列1到100 255 254 97 98 0 99 0 0 0列15到18 103 101 0 102 0 104 0

看起来很奇怪,不是吗?前有一些奇怪的字符在一开始,然后到处都有额外的零插入。发生了什么事?在这种情况下,示例文件保存在记事本,使用另存为…菜单项,选择保存它使用Unicode编码。(顺便说一句,当记事本说“Unicode”,他们真正的意思是utf - 16编码。)自文件打开的默认编码,MATLAB使用windows - 1252编码,转换数据,你所看到的结果。前两个字节一个字节顺序标记,我们将只需要跳过,因为他们并不表示数据。

一种可能的解决方案

现在对这个问题,你能做什么?如果你想更健壮的平台和语言/地区,您可以指定一个编码时使用fopen文件。例如,对于上述第一个问题:

fid = fopen (“sample4.txt”,' w ',“l”,“iso - 8859 - 1”);写入文件(fid检测器,“英语字母£¥§©”,“字符”);文件关闭(fid);类型(“sample4.txt”);
英语字母£¥§©

对于第二个问题,我们将跳过字节顺序标记,打开文件在Unicode编码,并关掉一个警告,表明,并不是所有的功能都是支持这个编码。金宝app就我们的目的而言,阅读文本,警告可以忽略。

警告MATLAB: iofun: 金宝appUnsupportedEncoding;fid = fopen (“sample3.txt”,“r”,“l”,“UTF16-LE”);fseek(支撑材2 0);str = fscanf (fid,' % s 'abs (str)文件关闭(fid);
str = abcdefgh ans = 97 98 99 100 101 102 103 104

正如您可以看到的,字符串读取正确。

一般而言,如果您的程序指定编码对阅读和写作,那么你不需要担心默认编码,因为你是显式地指定它。的字符数据被保存在一个文件中指定的编码,和MATLAB将读取的编码,因此保留所有的一致性。你只需要确保你储蓄是可表示的字符数据编码你选择。例如,如果您选择了“us - ascii”,你将无法写出一磅的迹象。如果你处理值的范围从128年到255年,我建议使用iso - 8859 - 1。如果你写日语,使用shift - jis可能是一个很好的一个。

一些有用的链接

你可以找到更多关于Unicode,编码,语言和地区在以下引用:

什么样的你遇到其他文件编码问题?贴在这里


使用MATLAB®7.3发表


评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。