A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

如题,请各位大神不吝赐教

29 个回复

倒序浏览
我的理解是oc的底层是用c写的,只是oc的话是面向对象了,一个汉子在oc和c中都是占用两个字符,感觉他们底层都一样,不太清楚我的理解对不对,希望其他大神给出批正
回复 使用道具 举报
C好像是三个
回复 使用道具 举报
这是编码的问题,跟OC与C没关系。
Xcode中中文占用3个字节,因为在utf-8里面中文要3个字节。C中占2个字节,最大可能是你默认使用GB2312编码格式,国标中中文占2字节。

区别1:字符集不同   区别2:编码格式不同。

----------------退后,下面开始装逼了------------
一。中文可能碰到的编码
ANSI:最早的时候计算机ASCII码只能表示256个符号(含控制符号),这个字符集表示英文字母足够,其中,我们键盘上可见的符号的编码范围是从32到126(大小写英文字母、数字、英文符号等)。但表示汉字、日语、韩语就不太够用了,汉字常用字有3000多个。

不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码

但是中国人也要用电脑打字,于是,中国人就研究出来了最早的中文字符集GB2312(GBK就是后来的扩展),GB2312的做法是,把ASC码取值范围的128~255这个区间挪用了一下,用两个ASC码表示一个汉字,这样可用的编码范围用十六进制表示就是0x8080到0xFFFF,这大概能表示一万多个符号,足够了。[注:实际没用那么多,GBK的范围是8140-FEFE]

那个时候,计算机技术还不发达,各个国家搞自己的,比如台湾,也另搞了一套,叫BIG5(俗称:大五码),跟大陆的也不太一样,但方法是类似的,都是用0x80到0xFF这个区间。
然后日语(有编码JIS)、韩语等等也各搞一套。

这些国家的编码区间都是重叠的,但同一个汉字(比如有一些汉字同时存在于简体、繁体、日语汉字中)有不同的编码,很混乱是不是?但也凑合用了。编码不同导致了很多麻烦,比如一个网页,如果你不知道它是什么编码的,那么你可能很难确定它显示的是什么,一个字符可能是大陆简体/台湾繁体/日本汉字,但又完全是不同的几个字。

所以如果用一些很老的软件,可能会听说有中文版/日文版之类的,对应的版本只能在对应的系统上运行。

后来,这个对操作系统的开发实在是太困难了,因为这意味着不同语言的版本,都要重新编码。于是发明了Unicode。

Unicode这个东西,就是要把地球上所有的语言的符号,都用统一的字符集来表示,一个编码真正做到了唯一。

Unicode里有几种编码方式:

UTF-16BE/LE:UTF-16就是Windows模式的编码模式(Windows里说的Unicode一般都是指这种编码),用2个字节表示任意字符,注意:英文字符也占2个字节(变态不?),这种编码可以表示65536个字符,至于LE和BE,就是一个数值在内存/磁盘上的保存方式,比如一个编码0x8182,在磁盘上应该是0x81 0x82呢?还是0x82 0x81呢?就是高位是最先保存还是最后保存的问题,前者为BE,后者为LE。

UTF-8:UTF-8则是网页比较流行的一种格式:用一个字节表示英文字符,用3个字节表示汉字,准确的说,UTF-8是用二进制编码的前缀,如果某个UTF-8的编码的第一个字节的最高二进制位是0,则这个编码占1字节,如果是110,则占2字节,如果是1110,则占3字节……

二。字符集与编码格式
对于 ASCII、GB 2312、Big5、GBK、GB 18030 之类的遗留方案来说,基本上一个字符集方案只使用一种编码方案。
比如 ASCII 这部标准本身就直接规定了字符和字符编码的方式,所以既是字符集又是编码方案;而 GB 2312 只是一个区位码形式的字符集标准,不过实际上基本都用 EUC-CN 来编码,所以提及「GB 2312」时也说的是一个字符集和编码连锁的方案;GBK 和 GB 18030 等向后兼容于 GB 2312 的方案也类似。
于是,很多人受这些遗留方案的影响而无法理解字符集和编码的关系。

对于 Unicode,字符集和编码是明确区分的。Unicode/UCS 标准首先是个统一的字符集标准。而 Unicode/UCS 标准同时也定义了几种可选的编码方案,在标准文档中称作「encoding form」,主要包括 UTF-8、UTF-16 和 UTF-32。
所以,对 Unicode 方案来说,同样的基于 Unicode 字符集的文本可以用多种编码来存储、传输。
所以,用「Unicode」来称呼一个编码方案不合适,并且误导。
回复 使用道具 举报
如何验证呢?
1.把下面代码保存到一个文本文体中
  1. #include <stdio.h>
  2. #include <string.h>

  3. int main(){
  4.         char *a = "我";
  5.         printf("%d",strlen(a));
  6.         return 0;
  7. }
复制代码


2. 在终端中用vim打开保存上面代码的文件。
    > vim char.c       ( >表示终端中输入)
3.在vim中输入如下  :set fileencoding   会显示当前编码格式。(冒号不能省略)
4.把文件编码改为utf-8     在打开的文件中输入 :set fileencoding=utf-8      
   冒号不能省,保存文件。
5.编译执行
   >gcc char.c
   >./a.out
6.重复3-5步,把第四步utf-8改为gb2312   
   :set fileencoding=gb2312
7.两次打印一个3,一个2
回复 使用道具 举报
汉字在C语言中我确定占3个.   OC 中还不知道 还没学到
回复 使用道具 举报
汉字编码所占字节数,与语言没有关系,是与编码方式有关,不过目前知道的编码方式都是2个字节。反正在c语言和OC中都是两个字节,如果你不确定可以打印一下试试,不过OC
回复 使用道具 举报
不过OC中的lenth返回的是个数,而不是字节数,如果想看字节数需要转换成c的 然后在看。。。。
回复 使用道具 举报
Xcode默认的中文编码格式是UTF-8,一个汉字占3个字节,所以在用Xcode的编写C语言程序的话,一个汉字也是3个字节,如果是GB2312,GBK德编码格式,一个汉字就占用2个字节。
回复 使用道具 举报
我只知道在C中占3个字节
回复 使用道具 举报
很不错,谢谢楼主分享!!
回复 使用道具 举报
liury 发表于 2015-11-22 21:04
如何验证呢?
1.把下面代码保存到一个文本文体中

嗯,回答的很详细,谢谢
回复 使用道具 举报
liury 发表于 2015-11-22 20:55
这是编码的问题,跟OC与C没关系。
Xcode中中文占用3个字节,因为在utf-8里面中文要3个字节。C中占2个字节 ...

这。。。。谢谢回答
回复 使用道具 举报

我回头看了一下老师讲的,在xcode中,C占1个字节,OC占3个字节
回复 使用道具 举报
石油小硕 发表于 2015-11-22 23:06
我只知道在C中占3个字节

在xcode中,C的一个汉字好像占1个字节
回复 使用道具 举报
正在输入中... 发表于 2015-11-22 21:30
汉字编码所占字节数,与语言没有关系,是与编码方式有关,不过目前知道的编码方式都是2个字节。反正在c语言 ...

嗯,对,这个说的有道理
回复 使用道具 举报
前面都分析好详细啊,学习一下
回复 使用道具 举报
心程变 发表于 2015-11-23 10:00
嗯,对,这个说的有道理

英雄所见略同。。。以后多多交流 学习哈、、、、
回复 使用道具 举报
前面的说的都很详细啊
回复 使用道具 举报
C3哥。OC一个
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马