Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP和多字节字符的帮助_Php_Multibyte - Fatal编程技术网

PHP和多字节字符的帮助

PHP和多字节字符的帮助,php,multibyte,Php,Multibyte,我有一个我认为很简单的问题,但结果却很复杂 我有一个很长的UTF-8字符串,它混合了罗马、西欧、日本和韩国字符和标点符号。许多是多字节字符,但有些(我认为)不是 我需要做两件事: 确保没有重复字符(并输出新字符串,去掉重复字符) 随机洗牌新字符串 (对不起,我似乎无法将代码引用的格式设置正确…) 使用这两个函数(有人非常有用地提供了这两个函数),我认为我已经准备好了……奇怪的是,似乎唯一字符串(没有重复)和无序字符串不包含相同数量的字符。(我从浏览器中突出显示这些字符,然后剪切并粘贴到另一个应用

我有一个我认为很简单的问题,但结果却很复杂

我有一个很长的UTF-8字符串,它混合了罗马、西欧、日本和韩国字符和标点符号。许多是多字节字符,但有些(我认为)不是

我需要做两件事:

  • 确保没有重复字符(并输出新字符串,去掉重复字符)
  • 随机洗牌新字符串
  • (对不起,我似乎无法将代码引用的格式设置正确…)

    使用这两个函数(有人非常有用地提供了这两个函数),我认为我已经准备好了……奇怪的是,似乎唯一字符串(没有重复)和无序字符串不包含相同数量的字符。(我从浏览器中突出显示这些字符,然后剪切并粘贴到另一个应用程序中…一个字符串的长度总是与上面的不同,但通常会有所不同…每次截断的字符数甚至不一样!)

    很抱歉,我对PHP了解不够,也不知道自己编写代码来研究这个问题,但这里到底出了什么问题?看起来洗一根长长的大绳子应该很容易,但显然比我想象的要难得多。有没有其他更简单的方法?我是否应该先将字符串转换为各自的十六进制数并将其洗牌,然后再转换回UTF-8?我应该输出到文件而不是屏幕吗


    有人有什么建议吗?很抱歉,我对这个很陌生,所以我可能只是在做一些非常愚蠢的事情。

    你可能可以做得简单得多

    下面是一个只获取字符串中唯一字符的函数:

    // returns an array of unique characters from a given string
    function getUnique( $string ) {
    
        $chars = preg_split( '//', $string, -1, PREG_SPLIT_NO_EMPTY );
        $unique = array_unique( $chars );
    
        return $unique;
    
    }
    
    然后,如果要重新排列顺序,只需将唯一字符数组传递给
    shuffle

    $shuffled = shuffle( $unique );
    
    编辑:对于多字节字符,此函数应该可以完成以下操作(感谢您对正则表达式的帮助):

    函数getUnique($string){
    
    $chars=预分割('/(?格式化代码很简单:在每行前面使用4个空格,它就会被识别为代码。请重新格式化您的代码。@apesa:谢谢!我不知怎的认为我必须在第一行中只放4个空格。Craig,非常感谢您提供了这一点……我决定尝试一种稍微不同的方式:使用Unicode。这可以编辑为去掉吗独特的&#uABCD;格式的图案?无论哪种方式,谢谢你的建议!!我也会试试,祈祷好运!@Dave-没问题,希望有帮助。我用一个包含汉字的字符串测试了它,它似乎工作得很好。(请记住,如果在浏览器中查看,请确保已为输出设置了UTF-8头,否则会出现错误).我不建议尝试使用
    和#uABCD;
    格式的字符,因为这样只会使它变得更复杂,但我相信您也可以使用正则表达式。如果一切顺利,请告诉我。
    // returns an array of unique characters from a given string
    function getUnique( $string ) {
    
        $chars = preg_split( '//', $string, -1, PREG_SPLIT_NO_EMPTY );
        $unique = array_unique( $chars );
    
        return $unique;
    
    }
    
    $shuffled = shuffle( $unique );
    
    function getUnique( $string ) {
    
        $chars = preg_split( '/(?<!^)(?!$)/u', $string ); 
        $unique = array_unique( $chars );
    
        return $unique;
    
    }