如何验证UTF-8字段的长度

数据库和应用程序使用UTF-8字符集,

表中有一个类型为char(2)的字段,

model中,验证规则为:


array('name', 'length', 'max'=>2)

表单view中条目如下:


CHtml::activeTextField($model,'name',array('size'=>20,'maxlength'=>2))

而当我仅输入一个汉字时,就得到input errors:


Name is too long (maximum is 2 characters).

可能把这个汉字按3个char算了,请问如何解决这个问题?

如果你希望可以存储两个汉字的话,那么字段设计应该是 char(6) 因为utf8占用3个字节

我在MySql中的字段定义就是Char(2),数据库是UTF-8字符集的。这个字段一直存储的也是两个汉字。

没人遇到过这问题吗?

:(

数据库中char(2)是定义了2个字符,即使是两个汉字,也算是2个字符,char(2)并非指存储2个字节的数据。而php中的验证,你因该改成’max’=>6,php在计算字节长度(而非字符)。

你验证一下,我依稀是这样记得。

使用 mb_len() 这样的函数。

Put into your php.ini or modify accordingly:




mbstring.func_overload = 7



加上了,并重启了电脑,问题依然如故。

实在不行就只能用这个笨办法了。

没看太懂,mb_len()是啥,怎么用法?

mbString 扩展函数 应该是 mb_strlen() 上面我写错了

问题解决了!

还是在 php.ini 文件的设置上。

在[mbstring]部分,不仅加入:

mbstring.func_overload = 7

再设置一句(在我的php.ini中,这句之前是注释掉的):

mbstring.internal_encoding = UTF-8

这回我的汉字都是按照汉字的字符个数来计数了:

strlen(‘aa’) 的值是 2

strlen(‘阿阿’) 的值是 2

strlen(‘aa阿阿’) 的值是 4

我的环境是: Linux(Ubuntu) & XAMPP1.7.1

感谢大家给我指明了解决问题的方向。

学习