包含特殊字符的问题打开文件

21日视图(30天)
似乎有一个问题指定非ascii字符fopen的文件名。我需要编码这些吗?
任何帮助表示赞赏,戴夫r。
OSX10.6、英语、瑞典语
> >功能(“DefaultCharacterSet”)
ans =
iso - 8859 - 1
> > getenv(朗)
ans =
sv_SE.ISO8859-1
现在,假设我有一个名为“oaa的文件。txt”(编码,如果我们有问题,246228229是ISO 8859 - 1字符后跟. txt)。在Matlab:
我想打开文件:
id = fopen (‘oaa.txt’,‘r’,‘n’,“utf - 8”) id =
1
作为一个单一的解决方案文件,我可以使用:> > D = dir (* . txt)
D =
名称:“oIaIaI.txt”
日期:“17 - jun - 2011 16:02:36”
字节:987
isdir: 0
datenum: 7.3467 e + 05
> > id = fopen (D.name,‘r’,‘n’,“utf - 8”)
id =
3
但我想一个解决方案,我可以直接指定文件名!

接受的答案

大卫·雷纳
大卫·雷纳 2011年6月20日
所以沃尔特的暗示,这实际上是utf - 8之后,我们发现在mac返回文件名分解形式,而其他系统使用组成形式(或者任何给定的用户)。 http://download.oracle.com/javase/6/docs/api/java/text/Normalizer.html
我没有找到任何方法处理这种在matlab的家乡,但Java提供了所需的方法:
% %一些方便的定义
NFD = javaMethod(“的”,“美元java.text.Normalizer形式”,“NFD”);
NFC = javaMethod(“的”,“美元java.text.Normalizer形式”,“NFC”);
use UTF8 = java.nio.charset.Charset.forName (“utf - 8”);
% %转换文件的名称从dir明智的matlab字符串:
D = dir (' * . txt ');
s2 = D.name;
s =以(uint8 (s2), UTF8);
sc = java.text.Normalizer.normalize(年代,NFC);
sc = char (sc);
比较字符串(sc oaa.txt)
ans =
1
% %,相反的,与重音字符:打开一个文件
文件名=“oaa.txt”;
s =以(文件名);
sc = java.text.Normalizer.normalize(年代,NFD);
b =单(sc.getBytes (use UTF8) ');
bs (b < 0) = 256 + (bs (b < 0));
id = fopen (char (bs)、“r”)
id =
3

更多的答案(2)

沃尔特·罗伯森
沃尔特·罗伯森 2011年6月17日
我可以问你向我们展示什么
0 + D.name
显示了吗?我们可以找到一个unicode2native()公式。
1评论
大卫·雷纳
大卫·雷纳 2011年6月17日
> > D.name + 0
ans =
111 204 136 97 204 136 97 204 138 116 120 116
我玩,但是没有成功,但我确信有组合我没有试过!
谢谢!

登录置评。


沃尔特·罗伯森
沃尔特·罗伯森 2011年6月17日
在那里。这是一个内部混乱在Windows。 http://stackoverflow.com/questions/3298569/difference-between-mbcs-and-utf-8-on-windows 这让我们Windows的WideCharToMultiByte函数 http://msdn.microsoft.com/en-us/library/dd374130%28v=vs.85%29.aspx 这让我们的国旗WC_COMPOSITECHECK价值被描述为,
转换复合字符,包括的基础和是非空间的字符,每个不同的字符值。翻译这些字符预作字符,这有一个字符值base-nonspacing字符的组合。例如,在这个角色e,e是基础和口音严重马克是是非空间的字符。
现在你有什么实际的文件名D.name报道是由版本。111年第一个字节是“o”和204年第二字节意味着大约前面的字符是“口音”,第三个字节136告诉你这口音,在这种情况下,分开。然后97字节告诉你下一个系列的基本特征是“a”和204年告诉你下一个字符口音前,和136年是“口音了。下一个97字节的序列告诉你基本字符“a”, 204年告诉你下一个字符的口音前,138表示不同的口音,在这种情况下小圆。
我猜,这是所使用的机制,将一个或多个Windows代码页编码,但是我没有搜索,看看我能找到细节关于这个翻译。
首先你需要做的一些试验和错误:构建一个测试文件名与感兴趣的每个字符,看看它出来一个名字。
转换表之后,您可以使用regexprep()来处理字符串,但一定要先做204,因为它将引入的其他翻译。
= = =
好吧,我将, 一些逻辑!
编码是有效使用utf - 8 (! !)。每个人物有另一个unicode分解版本基本字符后跟一个代码指示结合口音。unicode的口音从0开始x0300相结合的表示在utf - 8 0 xcc 204(十进制)其次是相对于0 x0300 128 +偏移量。看一看 http://www.fileformat.info/info/unicode/block/combining_diacritical_marks/utf8test.htm 悬停在0(细胞在第一行,注意是0 x0308结合分开。128 + 8 = 136字节. name中我们看到在204年(一个字节表示在使用utf - 8范围。)
所以有逻辑,但我建议使用正则表达式()是相同的。

类别

找到更多的在字符和字符串帮助中心文件交换

下载188bet金宝搏

社区寻宝

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

开始狩猎!