Board logo

标题: 这是个什么字符? [打印本页]

作者: DOSforever     时间: 2008-8-25 07:05    标题: 这是个什么字符?
下载一文件,文件名中包含有 "" (红色表示)这个字符,咋一看,很像中文的 "·" (蓝色表示)符号,即常用于外国人名和姓中间的间隔号,现在这里可能看不出有区别,但在文本编辑器中有时可以看出,间隔号是全角的,而这个不知名的符号(至少看上去)是半角的,但我为什么说有时可以看出呢?另一个奇怪就奇怪在这里,间隔号有时候看上去是半角的?就像在这个帖子中看到的一样。再回正题,我把这两个放到一起放大些可能就稍微看出有点明显差别了 "·"

对于这个字符,Windows 似乎可以正常操作,在资源管理器中可以看到,也可以复制、移动、删除文件,也可以改名时去掉这个字符,在命令行中也可以复制、移动、删除、改名,但 dir 却无法显示这个字符,该字符位置处显示的是“空白”,那么这个“空白”究竟是否是空格呢?而且,对于有这个字符的文件名,许多应用程序不认,无法对其操作,打开时说找不到文件之类的话。对于包含有这个字符的文本文件,许多纯文本编辑器都无法将其正常保存,保存后该处的字符变成了 “?” 即西文的问号。如果用 Windows 的 Notepad 保存的话会提示你这个文件包含 Unicode 格式的字符,如果保存为 ANSI 编码的文件将会丢失。那看来该字符是一个 Unicode 字符了?但我奇怪的是既然 Windows XP 可以处理 Unicode 字符,那为什么 dir 不能正常显示呢?那些可以正常处理 Unicode 编码的纯文本编辑器为什么不能正常保存呢?

按照 Unicode little endian 编码,该字符的编码是 FB 30

作者: stockghost     时间: 2008-8-25 09:47
刚才用UEStudio拷贝过去编辑了,却发现只有一个'?'
SlickEdit也是一样
拷贝到DOS下的编辑器,发现显示正确,只有一个字符,代码0xFA

作者: stockghost     时间: 2008-8-25 09:49
是不是编码问题?

作者: DOSforever     时间: 2008-8-25 22:48
以下是命令行环境下,不同代码页和不同编码环境下该字符的编码和表现(这话听上去怎么有点别扭?谁帮我重新叙述一下。)

CP ANSI Unicode dir
---------------------------------------
936: 3F FB 30 N

437: FA FB 30 Y

可以看出,在简体中文代码页的环境下,该字符转换为相应的 ANSI/ASCII 码值为 0x3F ,对应字符为 "?" ,那么这个问号究竟是确实是应该对应的问号,还是凡是不知道该对应什么字符的一律转换为问号?
在西文US代码页的环境下,该字符转换为相应的 ANSI/ASCII 码值为 0xFA ,对应的字符这里无法正常显示出来,这个字符确实也显示的是一个位置在中间的点,可以看作是西文的间隔号。可以认为这里做了正确的转换。
不论哪一种代码页环境下,Unicode 编码始终都是一样的,看来确实是 Universal 。

在 CP936 环境下,dir 该字符不能正常显示,该处显示的是一个“空白”。
在 CP437 环境下,dir 能够正确显示该字符。

我奇怪的是,既然 WindowsXP 可以处理 Unicode 字符集,为什么以前从未碰到此类问题呢?那么到此为止是不是可以这么说, Unicode 字符集中的字符转换为不同代码页对应的字符还不完善?或者,我在 Windows 中还需要做什么设置?

作者: DOSforever     时间: 2008-9-13 03:44
又遇到两个类似的字符,在 Windows 的资源管理器中和命令行中的操作表现和前述的一样,该字符 「」 和中文的全角符号 「」 咋看上去很像。而且不像中文全角字符,它们是占半角的。如果把该字符复制以 ANSI 编码保存后都变为 ? 了,这两个字符的 Unicode 编码分别是 0x62FF 和 0x63FF 。

看来类似的 Unicode 中文字符很多?如此看来,Unicode 编码的汉字字符(姑且这么称)都不能正确地转换为相应的 ANSI 编码的中文字符?

作者: tigerpower     时间: 2008-9-15 21:49
因为各个字符集并非出自同一组织,所以相互之间是交集的关系,大多数字符集包含ASCII,而Unicode包含所有的字符集。
Windows XP把所有的文件名存储为Unicode,所以能在文件名里看见这些字符。
而在中文版Windows XP中的命令行cmd.exe默认以GBK编码运行(就是cp936),所以那些在GBK编码中没有的字符就看不到。
可以正常处理 Unicode 编码的纯文本编辑器,如果没有以unicode编码打开,就无法保存那些字符集中没有的字符。

我们可以看看楼主所找出的都是些什么字符:
打开记事本,将那6个字符复制上去,且一行一个,
文件->另存为->编码:Unicode big endian,文件名:c:\ch.txt
然后打开命令行,运行:
echo d 100 l 22 | debug c:\ch.txt
这条命令查看ch.txt的16进制格式,结果类似于:
-d 100 l 22
0B67:0100 FE FF 30 FB 00 0D 00 0A-00 B7 00 0D 00 0A FF 62 ..0............b
0B67:0110 00 0D 00 0A FF 63 00 0D-00 0A 30 0C 00 0D 00 0A .....c....0.....
0B67:0120 30 0D 0.

然后开始 -> 附件 -> 系统工具 -> 字符映射表
字体选Arial Unicode MS,选中下方“高级查看”,字符集:Unicode,分组:全部
在“转到Unicode”框里填上面红色的四个字符(如30FB),
就找到了该字符,并在最下方有该字符的名字,这6个字符依次是:
    片假名中间点
    中间点
    半形左角括号
    半形右角括号
    左角括号
    右角括号


Last edited by tigerpower on 2008-9-16 at 08:35 PM ]

作者: DOSforever     时间: 2008-9-16 03:53
我用的是英文版的 WindowsXP ,在字符映射表中,字体选择没有 Arial Unicode MS ,只有 Arial 和 Arial Black ,唯一一个和 Unicode 有关的是 Lucida Sans Unicode 。但是我按照 30fb 填进去所显示的字符不是原来的字符。既然都选 Unicode 字符集,那和选什么字体有什么关系?
一般,应用程序让你所选择的字符集中 Unicode 就是指 Unicode litte endian ,big endian 和 UTF-8 会另外写明,那你为什么一开始就想到要看它的 Unicode big endian 编码?字符映射表中为什么也是让你填 big endian 的编码?

作者: tigerpower     时间: 2008-9-16 21:32
没有Arial Unicode MS就选MS Mincho或MS Gothic,至于Lucida Sans Unicode,虽然是用Unicode编码的字体,但是不支持日文,所以日文字符(30FB)是找不到的。

Windows XP本身是设计成Little Endian结构的。
修改过游戏的朋友都知道,4字节查找金钱1000(16进制的3E8)在内存里是E8 03 00 00,这就叫Little Endian。
而Windows XP中的程序几乎都是Little Endian的,所以你见到一些程序UTF-16默认使用Little Endian。
但这只是Windows中的规矩,根据Unicode官方,当UTF-16不标明是BE还是LE时,默认是指BE,
具体还需根据文件头部的BOM(Byte Order Mark)判别。

至于是怎么想到要看它的 Unicode big endian 编码嘛,我也是试出来的:)

作者: DOSforever     时间: 2008-9-17 01:18
呵呵呵呵…… 你小子还记得玩游戏

看了我还是有点糊涂,既然那些没标明 Unicode 的字体为什么可以有 Unicode 字符?
应用程序中选什么字体,可能不影响保存,但为什么不影响显示呢?比如我的记事本中的默认字体为 Lucida Console 而不是 Lucida Sans Unicode ,也不是 MS Mincho或 MS Gothic,其对应的 0x30FB 编码不是这个“片假名中间点”而是其它字符,但为什么照样可以正确显示呢?
顺便再问个问题,字体名前面有个 T 字样的代表是 TrueType 字体,有个 O 字样的是什么意思?

作者: tigerpower     时间: 2008-9-17 22:17
没标明Unicode的字体有些也是用Unicode编码的,比如上次提到的那二个日文字体。
记事本对于默认字体中没有的字就去找另外一种字体显示它。
Lucida Console里根本就没有汉字,能显示汉字是因为系统中有宋体。
至于它是以什么规则、什么顺序去找字体就不清楚了(Windows XP中文版中的记事本对找不到的字似乎会寻找宋体)。
但不是都能找到的,下方蓝色方框里第二行是六字真言的藏文写法,你贴到记事本看看,通常不能显示(如浏览器不能正常显示,请安装Arial Unicode MS字体)
另外,有O 字样的是OpenType字体。

六字大明咒:唵嘛呢叭咪吽
ༀ་མ་ཎི་པད་མེ་ཧཱུྃ

作者: DOSforever     时间: 2008-9-19 02:54
我的浏览器确实不能正常显示,而且不同的浏览器对不能正常显示的字符表现也不同。

IE 和以 IE 为核心的浏览器显示的是一个个方框,但同样是非 IE 核心的 Opera 显示的也是方框


非 IE 核心的 NetScape Navigator 和 K-Meleon 显示的是一个个问号


最好的我看是 Firefox 了,它对不能正确显示的字符把它的编码显示出来

但不知这是 big endian 还是 little endian 还是 UTF-16 ?还有我不解的是,你说的是六字,但从这 Firefox 显示出的编码来看,怎么是17个字符?

另外,哪里去单独下载字体,去 Microsoft 的网站上?

作者: tigerpower     时间: 2008-9-19 20:48
我上传了一个:Arial Unicode MS

md5:
bea62eb276a6f49d409efb49e1d190bb *arialuni.7z

作者: DOSforever     时间: 2008-9-20 02:05
嘿嘿,不错,能正确显示了。
原来所说的六字是指翻译成汉字为六个字,原藏文为17个字

作者: fujianabc     时间: 2008-9-20 21:14
Originally posted by DOSforever at 2008-9-20 02:05 AM:
嘿嘿,不错,能正确显示了。
原来所说的六字是指翻译成汉字为六个字,原藏文为17个字

藏文是6个字,好像你显示的有问题,把藏文每个字的音素都拆开了,我vista的ie 7下显示的是6个字(每个字以倒三角形符号为间隔)

Last edited by fujianabc on 2008-9-21 at 11:46 AM ]
附件 1: 5o2V6I63_ysamN7Yvq4HK[1].png (2008-9-21 11:45, 2.79 KiB,下载次数: 1)



作者: DOSforever     时间: 2008-9-21 01:52
不知道这究竟是我本身的系统问题,还是 Windows XP 与 Vista 之间区别的问题,还是 IE6 和 IE7 之间区别的问题?你和 tigerpower 在 Windows XP + IE6 下的显示和我一样吗?

作者: fujianabc     时间: 2008-9-21 11:52
Originally posted by DOSforever at 2008-9-21 01:52 AM:
不知道这究竟是我本身的系统问题,还是 Windows XP 与 Vista 之间区别的问题,还是 IE6 和 IE7 之间区别的问题?你和 tigerpower 在 Windows XP + IE6 下的显示和我一样吗?

我现在没有xp+ie6的环境,我在win2000+ie6试了一下,藏文是方框,显示不出来。

记得以前微软提到过,从vista开始,windows支持少数民族语言了。也就是说,vista之前不能完整支持少数民族语言。

作者: tigerpower     时间: 2008-9-21 12:00
这是是Windows XP与Vista之间区别,Vista对藏文支持较好,有专门的字体显示藏文,即“喜马拉雅”(Microsoft Himalaya),该字体显示藏文的素质较Arial Unicode MS要好。

喜马拉雅输入法中含有该字体文件himalaya.ttf,下载安装后即可看到类似14楼fujianabc显示的效果


以下蓝色方框中第二行为Arial Unicode MS,第三行为Microsoft Himalaya。
(Vista中默认无Arial Unicode MS)

六字大明咒:唵嘛呢叭咪吽
ༀ་མ་ཎི་པད་མེ་ཧཱུྃ
ༀ་མ་ཎི་པད་མེ་ཧཱུྃ

作者: driver1998     时间: 2008-9-29 11:42
我在Windows XP SP2+IE6 SP2+遨游2.1.4.443 UNICODE的效果:
附件 1: 001.jpg (2008-9-29 11:42, 21.68 KiB, 下载附件所需积分 1点 )