[讨论]令人晕菜的c++ 中英文混合string长度

C、C++和Java语言
回复
头像
spider5
帖子: 351
注册时间: 2005-12-15 21:52
送出感谢: 0
接收感谢: 0

[讨论]令人晕菜的c++ 中英文混合string长度

#1

帖子 spider5 » 2007-11-03 22:48

前段时间分析一个html-style的文件,涉及中英文混合的字符串常量长度计算,
很自信地就按照中文2byte,英文和符号1byte的方法写了,结果完全不对。

后来只好用length方法一个个测量长度后再修正。根据length得到的结果,
几乎每个标示长度都超过我的预计,而且我还没看出其中的规律来,
请问谁知道这个字符串长度计算有什么规律?
文件是utf8格式的。
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

#2

帖子 eexpress » 2007-11-03 23:09

gtk?
变量定义/长度统计,都用g开头的宏。就容易了。devhelp里面找就是。别用标准的C写法。
● 鸣学
头像
stlxv
论坛版主
帖子: 8273
注册时间: 2006-05-03 0:39
来自: المريخ
送出感谢: 0
接收感谢: 1 次

Re: [讨论]令人晕菜的c++ 中英文混合string长度

#3

帖子 stlxv » 2007-11-03 23:39

spider5 写了:前段时间分析一个html-style的文件,涉及中英文混合的字符串常量长度计算,
很自信地就按照中文2byte,英文和符号1byte的方法写了,结果完全不对。

后来只好用length方法一个个测量长度后再修正。根据length得到的结果,
几乎每个标示长度都超过我的预计,而且我还没看出其中的规律来,
请问谁知道这个字符串长度计算有什么规律?
文件是utf8格式的。
中文2byte不是绝对的,而是要看什么编码。

例如utf8格式的中文一般是3byte的。
PHP是最好的语言!不服来战!
头像
stlxv
论坛版主
帖子: 8273
注册时间: 2006-05-03 0:39
来自: المريخ
送出感谢: 0
接收感谢: 1 次

#4

帖子 stlxv » 2007-11-03 23:43

utf8的存储是每个字符1-3字节,没有固定存储长度

例如A是一个字节,“假”是3个字节。

如果你用的C++类库对utf8的支持比较好的话,应该有直接将他们每个文字分开的功能。
PHP是最好的语言!不服来战!
头像
madoldman
帖子: 599
注册时间: 2006-02-27 20:19
来自: works system
送出感谢: 0
接收感谢: 0
联系:

Re: [讨论]令人晕菜的c++ 中英文混合string长度

#5

帖子 madoldman » 2007-11-05 15:56

spider5 写了:前段时间分析一个html-style的文件,涉及中英文混合的字符串常量长度计算,
很自信地就按照中文2byte,英文和符号1byte的方法写了,结果完全不对。

后来只好用length方法一个个测量长度后再修正。根据length得到的结果,
几乎每个标示长度都超过我的预计,而且我还没看出其中的规律来,
请问谁知道这个字符串长度计算有什么规律?
文件是utf8格式的。

你还是先看看utf8编码的格式吧
以下文字转自http://dev.csdn.net/article/40/40146.shtm
  因为一个字母还有一些键盘上的符号加起来只用二进制七位就可以表示出来,而一个字节就是八位,所以UTF8就用一个字节来表式字母和一些键盘上的符号。然而当我们拿到被编码后的一个字节后怎么知道它的组成?它有可能是英文字母的一个字节,也有可能是汉字的三个字节中的一个字节!所以,UTF8是有标志位的!

  当要表示的内容是 7位 的时候就用一个字节:0*******  第一个0为标志位,剩下的空间正好可以表示ASCII 0-127 的内容。

  当要表示的内容在 8 到 11 位的时候就用两个字节:110***** 10******  第一个字节的110和第二个字节的10为标志位。

  当要表示的内容在 12 到 16 位的时候就用三个字节:1110***** 10****** 10******    和上面一样,第一个字节的1110和第二、三个字节的10都是标志位,剩下的空间正好可以表示汉字。

  以此类推:
四个字节:11110**** 10****** 10****** 10******
  五个字节:111110*** 10****** 10****** 10****** 10******
  六个字节:1111110** 10****** 10****** 10****** 10****** 10******
东西路,南北走
十字路口人咬狗
拿起狗来打砖头
砖头咬了狗一口
图片
头像
madoldman
帖子: 599
注册时间: 2006-02-27 20:19
来自: works system
送出感谢: 0
接收感谢: 0
联系:

#6

帖子 madoldman » 2007-11-05 16:00

也就是,看第一个字节的开头有多少个连续的1,这个字就占多少个字节,UTF-8 编码字符理论上可以最多到 6 个字节长, 然而 16 位 BMP 字符最多只用到 3 字节长
东西路,南北走
十字路口人咬狗
拿起狗来打砖头
砖头咬了狗一口
图片
头像
tipfoo
帖子: 303
注册时间: 2007-07-12 16:30
来自: 桂林
送出感谢: 0
接收感谢: 2 次

#7

帖子 tipfoo » 2007-11-06 21:17

好,精譬!
njayong001
帖子: 39
注册时间: 2007-11-01 0:33
来自: 江苏南京
送出感谢: 0
接收感谢: 0

#8

帖子 njayong001 » 2007-11-07 15:56

既然LZ明知文件是UTF-8编码,为什么不先去找一下UTF-8编码的资料呢?如果不能改变自己的学习方法,以后的路很难走下去。。。
身在L营心在W
头像
forrid
帖子: 659
注册时间: 2007-04-23 17:40
送出感谢: 0
接收感谢: 0

#9

帖子 forrid » 2007-11-14 22:08

微软忒变态,整个~~~

吾生也有涯,而知也无涯,以有涯随无涯,SB啊~~~~~~~~~~
头像
hubert_star
论坛版主
帖子: 5372
注册时间: 2007-10-29 22:12
系统: OSX 10.9 + Ub 1304
来自: 江苏南京
送出感谢: 0
接收感谢: 5 次

#10

帖子 hubert_star » 2007-11-15 23:54

还是怪学校吧,学校教的就是英文一个字节,中文两个字节,根本也不说明是字符集的问题。
回复

回到 “C/C++/Java”