日期:2014-05-16  浏览次数:20351 次

在javascript中获取中英文字符长度的问题
最近搬家到javaeye了,将以前的日志也搬来几个:

var i="中国a";

一般情况下,我们用i.length会得到结果3

但有时候我们需要5,下面的小代码可以解决问题

<script>
 alert (fucCheckLength("中国aaaa"));
 function fucCheckLength(strTemp)
{
 var i,sum;
 sum=0;
 for(i=0;i<strTemp.length;i++)
 {
  if ((strTemp.charCodeAt(i)>=0) && (strTemp.charCodeAt(i)<=255))
   sum=sum+1;
  else
   sum=sum+2;
 }
 return sum;
}
 </script>

会得到结果是:8
1 楼 skydream 2008-01-13  
有时候我们需要5?

你是指要得到的字节长度吧?请注意字节和字符的差异。而字节长度是和编码有关系的,比如"中国a",gbk/gb2312编码是5个字节,可是如果是utf-8,则是7个字节(utf-8下通常一个汉字3个字节)。

楼主似乎对字节长度的概念还不是很清楚,虽然一般情况下汉字字符大都使用gbk。但是不能把汉字和2个字节直接划上等号。

假设后台数据库是采用utf-8保存数据,表结构中某个字段的长度是30个字节,那么用楼主你的这个函数,长度计算就出问题了。

2 楼 nooalou 2008-01-13  
skydream 写道
有时候我们需要5?

你是指要得到的字节长度吧?请注意字节和字符的差异。而字节长度是和编码有关系的,比如"中国a",gbk/gb2312编码是5个字节,可是如果是utf-8,则是7个字节(utf-8下通常一个汉字3个字节)。

楼主似乎对字节长度的概念还不是很清楚,虽然一般情况下汉字字符大都使用gbk。但是不能把汉字和2个字节直接划上等号。

假设后台数据库是采用utf-8保存数据,表结构中某个字段的长度是30个字节,那么用楼主你的这个函数,长度计算就出问题了。


对于技术,谁也不能说一定比谁强,我建议只要就问题讨论就好,不要评价别人的能力,这样就显得狭隘了。

你所说的是一方面,我所说的是另一方面,发帖子就是希望当朋友们遇到了我所说的情况下,可以有个可以参考和借鉴的例子就好。大家就是你帮我我帮你嘛。

如果我们系统的数据库真如你所说的情况,想必大家用一下就会知道结果对不对了,没必要非给出个一定对或一定不对的结论,难道代码中还要加上更多判断不成,合适就好。
Take it easy!
3 楼 skydream 2008-01-13  
楼主太激动了,我并没有评价你的能力,只是善意的指出一个汉字==长度2这个观点的由来和可能存在的问题而已。

在我开发的项目中,的确存在后台数据库采用utf-8,造成前台js在检测字符串长度是否超过数据库容许时需要将汉字长度计算为3的情况。
4 楼 chsenr 2008-12-16  
skydream 写道
楼主太激动了,我并没有评价你的能力,只是善意的指出一个汉字==长度2这个观点的由来和可能存在的问题而已。

在我开发的项目中,的确存在后台数据库采用utf-8,造成前台js在检测字符串长度是否超过数据库容许时需要将汉字长度计算为3的情况。


呵呵,其实你从数据库来考虑是有一定道理的。但是这段代码的作用甚至有可能跟数据库完全没有关系。比如,用户呢称,从显示角度 ,如果要简单的限制一下总体长度,可以这样做,因为一个英文字符的宽度大概是半个汉字的宽度。
5 楼 samm 2008-12-24  
chsenr 写道
skydream 写道
楼主太激动了,我并没有评价你的能力,只是善意的指出一个汉字==长度2这个观点的由来和可能存在的问题而已。

在我开发的项目中,的确存在后台数据库采用utf-8,造成前台js在检测字符串长度是否超过数据库容许时需要将汉字长度计算为3的情况。


呵呵,其实你从数据库来考虑是有一定道理的。但是这段代码的作用甚至有可能跟数据库完全没有关系。比如,用户呢称,从显示角度 ,如果要简单的限制一下总体长度,可以这样做,因为一个英文字符的宽度大概是半个汉字的宽度。


呵呵,为什么限制长度呢,就是因为数据的长度设置好了
6 楼 longrm 2008-12-25  
skydream 写道
有时候我们需要5?

你是指要得到的字节长度吧?请注意字节和字符的差异。而字节长度是和编码有关系的,比如"中国a",gbk/gb2312编码是5个字节,可是如果是utf-8,则是7个字节(utf-8下通常一个汉字3个字节)。

楼主似乎对字节长度的概念还不是很清楚,虽然一般情况下汉字字符大都使用gbk。但是不能把汉字和2个字节直接划上等号。

假设后台数据库是采用utf-8保存数据,表结构中某个字段的长度是30个字节,那么用楼主你的这个函数,长度计算就出问题了。


这个问题该怎么解决?
7 楼 liucl_tiger 2008-12-25  
这是JS中的,请问有没有在java中的呢?