0

嘿家伙希望你能帮助我。

我需要制作一个用 php+codeigniter 编码的网站才能使用 utf 16 字符集。

所以要转换它,

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

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

我已将 config.php 设置为:

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

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

我的表单验证检查开始失败,尤其是长度检查。

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

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


更新:事实证明,如果您执行 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!

4

2 回答 2

0

是的,它是正确的,因为转换后

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

 mb_strlen('admin@admin.com') // 15;
 mb_strlen('摡業䁮摡業⹮潣') // 7;
于 2012-10-21T14:50:06.330 回答
0

用这个:

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

   echo strlen($utf16_string);

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

于 2012-10-21T14:38:53.130 回答