codeigniter,转换为utf 16字符集,表单验证错误的长度

时间:2012-10-21 14:17:44

标签: php codeigniter validation utf-16 utf

嘿伙计们希望你能帮助我。

我需要使用php + codeigniter编写一个网站,以便与utf 16字符集一起使用。

所以转换它,

我已将database.php设置转换为:

$db['default']['char_set'] = 'utf16';
$db['default']['dbcollat'] = 'utf16_unicode_ci';

我已将config.php设置为:

$config['charset'] = 'UTF-16';

这似乎解决了输出数据时引起的问题,但我现在遇到了一个新问题。

我的表单验证检查已开始失败,特别是长度为1。

即在调试时我发现它使用mb_strlen函数将admin@admin.com作为长度为7。

请注意,在charset更改之前它正常工作!字符集更改后问题就开始了。


更新:如果你做了mb_strlen($ str,'utf-8')我会得到正确的答案,这意味着我从表单中获得了utf-8编码的字符串。


更改min_length函数
public function min_length($str, $val)
    {
        if (preg_match("/[^0-9]/", $val))
        {

            return FALSE;
        }

        if (function_exists('mb_strlen'))
        {

            return (mb_strlen($str) < $val) ? FALSE : TRUE;
        }

        return (strlen($str) < $val) ? FALSE : TRUE;
    }

到此:

public function min_length($str, $val)
    {
        if (preg_match("/[^0-9]/", $val))
        {

            return FALSE;
        }

        if (function_exists('mb_strlen'))
        {
            echo $str,"<br/>";
            echo mb_strlen($str),"<br/>";
            echo $val;die();
            return (mb_strlen($str) < $val) ? FALSE : TRUE;
        }

        return (strlen($str) < $val) ? FALSE : TRUE;
    }

我得到以下输出:

admin@admin.com
7
8

即将admin@admin.com作为长度7!

2 个答案:

答案 0 :(得分:0)

使用它:

   $utf16_string = unicode_encode($string, 'UTF-16');

   echo strlen($utf16_string);

所以只有在将其转换为utf-16之后,strlen()才能正常工作

答案 1 :(得分:0)

是正确的,因为转换后

 "admin@admin.com" = 摡業䁮摡業⹮潣
                        ^---------- after conversion to UTF-16

并且

 mb_strlen('admin@admin.com') // 15;
 mb_strlen('摡業䁮摡業⹮潣') // 7;