免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5651 | 回复: 8
打印 上一主题 下一主题

fopen("你好.txt") "你好.txt"以什么格式存储 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-12 13:57 |只看该作者 |倒序浏览
假设我winxp 中文版,vc2008 ,未作任何额外设置。

系统的文件系统存储的目录名、文件名,是什么格式编码的?(是gb2312,还是gbk之类,如何确认)
假设我通过fstatW函数获取文件名,结果为unicode编码,那是不是此函数返回时已经把系统内码转为了unicode
假如我fstatA获取文件名,返回char* 此时获取的是原始的系统内码格式的文件名么?它没做任何转换么?

vc下 WideCharToMultiByte函数 能把一个unicode转为指定的编码格式,
假如我指定为:CP_ACP
winnls.h 中:
#define CP_ACP                    0           // default to ANSI code page
#define CP_UTF8                   65001       // UTF-8 translation

ansi编码是什么格式,它如何区分字符边界呢?????
(我意识中,ansi就是255个字符,没有所谓边界,但如果那样的话,fopen(const char *s)
字符串s应该会出现解析混乱呀 )

[ 本帖最后由 windyrobin 于 2009-3-12 13:59 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-03-12 14:00 |只看该作者
2的8次方是256

论坛徽章:
0
3 [报告]
发表于 2009-03-12 15:25 |只看该作者

回复 #1 windyrobin 的帖子

对于 8-bit ASCII,它也只是对给定数据(GB2312/GBK/GB18030/……)的一种 reinterpretation,不存在溢出的问题。但前提是必须先重新转回 wide characters 才能进行其它操作。

论坛徽章:
0
4 [报告]
发表于 2009-03-12 17:49 |只看该作者

回复 #3 langue 的帖子

按你的意思说:
通过 fstatA 方式返回的ascil字符的实际编码就是系统内码,
没做任何转换。

论坛徽章:
0
5 [报告]
发表于 2009-03-12 18:21 |只看该作者
这位仁兄对字符串的理解有点模糊。
你要分清ASCII和Unicode的区别,是2中不同的编码方式而已,
正是因为ASCII的表达字符方式太少(2^7-1=255)而Unicode可以表示字符(2^15-1=65536),
所以才采用Unicode编码以兼容世界所有其他国家的语言。现在的NT系统基本都是支持Unicode的。
   因为Unicode编码采用双字节表示字符,而标准的ASCII只有单字节,所以单字节到双字节的转换很简单:
例如0x61("a")是ACII码,到Unicode就高位填充0x0061,这就是转换过程,ASCII的转换边界,
如果一定要说边界,那么就是1字节,同样,Unicode的边界是2个字节。

楼主还有个疑问,那么为什么fopen(char× str)可以打开中文目录呢? 大家都知道中文是双字节表示的,转换成char×以后,
举个例子,例如wstring = _T("文件"); 内存序列可能是0x1234,0x5678, 转换成char×,内容会产生变化,产生负数而且可以被操作系统识别

[ 本帖最后由 Wells.Wolfgang 于 2009-3-12 18:29 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-03-12 18:40 |只看该作者

回复 #5 Wells.Wolfgang 的帖子

按照这位仁兄所说 ,
若CreateFileA("你好.txt"..)可以成功打开 ,这就意味着,“你好.txt”被编译到静态存储区中,
是以gb2312或gb18030之类的系统内码编码。
CreateFileW("你好.txt"..)则会出现异常,原因同上,
CreateFileW(_L("你好.txt") ,..)也会成功,是因为“你好.txt”被编译成了unicode。

当调用CreateFileW时 ,系统知道传入的字符串是unicode的,所以底层把它再转化为
本地gb2312或gb18030,并与文件系统存储的文件路径对比...

当调用fstatA产看成员.d_name时 ,系统返回的文件名是系统内码(gb2312,gb18030)等编码的数据!!

vc下 WideCharToMultiByte函数 能把一个unicode转为指定的编码格式,
假如我指定为:CP_ACP
winnls.h 中:
#define CP_ACP                    0           // default to ANSI code page

其实系统的转换结果是并非是什么ANSI,ANSI根本不是编码方式,真实返回的是char*指针的系统内码
gb2312编码的数据!!!!

以上我的理解有什么错误么??

[ 本帖最后由 windyrobin 于 2009-3-12 18:43 编辑 ]

论坛徽章:
1
寅虎
日期:2014-11-30 21:25:54
7 [报告]
发表于 2009-03-12 23:06 |只看该作者
fopen("你好.txt")  是和你的源代码一个格式的

论坛徽章:
0
8 [报告]
发表于 2009-03-13 11:05 |只看该作者
原帖由 windyrobin 于 2009-3-12 18:40 发表
按照这位仁兄所说 ,
若CreateFileA("你好.txt"..)可以成功打开 ,这就意味着,“你好.txt”被编译到静态存储区中,
是以gb2312或gb18030之类的系统内码编码。
CreateFileW("你好.txt"..)则会出现异常,原因 ...


我觉得这次理解很正确,也相当深刻

  系统中默认的字符编码应该是Gb2312没错,GB2312只是Unicode的一个子集,他们的编码方式完全不同。
例如:汉字“啊”,它的 GB2312 编码为 0xB0A1,但是它的 Unicode 编码为 0x554A。 所以他们中间的确需要个转换规则。
ANSI只是一个很弱符号集,所以汉字的确不存在什么ANSI编码的说法。WideCharToMultiByte函数返回的是将Unicode码转换成
GB码的一个char×指针。


参考:

GB2312 字符集

GB2312 是汉字字符集和编码的代号,中文全称为“信息交换用汉字编码字符集”,由中华人民共和国国家标准总局发布,一九八一年五月一日实施。GB 是“国标” 二字的汉语拼音缩写。

GB2312 字符集 (character set) 只收录简化字汉字,以及一般常用字母和符号,主要通行于中国大陆地区和新加坡等地。

GB2312 共收录有 7445 个字符,其中简化汉字 6763 个,字母和符号 682 个。

GB2312 将所收录的字符分为 94 个区,编号为 01 区至 94 区;每个区收录 94 个字符,编号为 01 位至 94 位。GB2312 的每一个字符都由与其唯一对应的区号和位号所确定。例如:汉字“啊”,编号为 16 区 01 位。

GB2312 字符集的区位分布表:

  区号    字数    字符类别

    01      94    一般符号
    02      72    顺序号码
    03      94    拉丁字母
    04      83    日文假名
    05      86    Katakana
    06      48    希腊字母
    07      66    俄文字母
    08      63    汉语拼音符号
    09      76    图形符号
10-15            备用区
16-55    3755    一级汉字,以拼音为序
56-87    3008    二级汉字,以笔划为序
88-94            备用区

这本手册列出了 GB2312 的全部字符和它们的区位号。

GB2312 编码

GB2312 原始编码 (encoding) 是对所收录的每个字符都用两个字节 (byte) 表示。第一字节为“高字节”,由字符的区号值加上 32 而形成;第二字节为“低字节”,由字符的位号值加上 32 而形成。例如:汉字“啊”,编号为 16 区 01 位。它的高字节为 16 + 32 = 48 (0x30),低字节为 01 + 32 = 33 (0x21),合并而成的编码为 0x3021。

论坛徽章:
0
9 [报告]
发表于 2009-03-13 19:46 |只看该作者

回复 #8 Wells.Wolfgang 的帖子

感谢回复,我也觉得应该如此
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP