【问题标题】:php str_shuffle does wrong encoding on greek lettersphp str_shuffle 对希腊字母编码错误
【发布时间】:2020-11-19 22:57:50
【问题描述】:

我正在做一个项目,我使用 phpxampp sql server 中抓取一个随机的希腊词。然后我使用str_shuffle() 随机化单词顺序(ex. bye => ybe)。但是在希腊字母上使用str_shuffle() 会返回带有很多????代替大多数希腊字母。如果我从我的代码中删除 str_shuffle() 希腊词正确显示没有 ??? . 我编写的代码确保我有正确的编码,但 str_shuffle() 是问题所在。

<h1 id = "hidden-word">The word is :
                <?php 
                    
                    $link = mysqli_connect('localhost' , 'root' , '' ,'dodecanese');
                    if(!$link){
                        echo 'Error connecting to DB';
                        exit;
                    }

                    mysqli_query($link,"SET NAMES 'utf8'");

                    $query = "SELECT island_name FROM dodecanese ORDER BY RAND() LIMIT 1";
                    $result = mysqli_query($link, $query);
                    if(!$result){
                        echo 'There is an issue with the DB';
                        exit;
                    }
                    $row = mysqli_fetch_assoc($result); 
                    //str shuffle creates ?
                    echo '<span id = "random-island">'.str_shuffle($row['island_name']). '</span>';
                ?>
        
</h1> 

我在 html 上也有编码 &lt;meta charset="utf-8"/&gt; 。我看过很多关于这个的帖子,尤其是UTF-8 all the way through,但这并没有帮助。感谢您对此的帮助。提前谢谢你。

【问题讨论】:

标签: php mysql utf-8


【解决方案1】:

我在PHP manual 中查看了str_shuffle,并在 cmets 中发现确实存在一些 unicode 字符的问题。

但是那里也有一个解决方案 - 我已经为你测试过,它有效:

<?php

function str_shuffle_unicode($str) {
    $tmp = preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY);
    shuffle($tmp);
    return join("", $tmp);
}


$a = "γκξπψ";
$b = str_shuffle($a);
$c = str_shuffle_unicode($a);

echo $a; // γκξπψ
echo "<br/>str_shuffle: ".$b; // ξ��κ�ψ�
echo "<br/>str_shuffle_unicode: ".$c; // κξγπψ
?>

【讨论】:

    【解决方案2】:

    不幸的是 str_shuffle() 不适用于多字节字符,并且没有(或者至少我不知道这样的)内置函数可以做到这一点。作为一种解决方法,您可以自己编写一个。例如,下面的代码会将字符串拆分为单个字母的数组,将数组打乱,然后将其元素连接回字符串(示例中使用的是西里尔字母):

    $str = "абвгдежзий";
    $temp = mb_str_split($str,1);
    shuffle($temp);
    $str = join("", $temp);
    echo $str;
    

    上述函数 mb_str_split 仅适用于 PHP 7.4+。如果你使用的是早期版本,你可以使用 preg_split:

    $str = "абвгдежзий";
    $temp = preg_split("//u", $str, 0);
    shuffle($temp);
    $str = join("", $temp);
    echo $str;
    

    比较难受的preg_match_all:

    $str = "абвгдежзий";
    preg_match_all('/./u', $str, $temp);
    shuffle($temp[0]);
    $str = join("", $temp[0]);
    echo $str;
    

    甚至循环并逐个字符添加到数组中(这样可以保存正则表达式调用):

    $str = "абвгдежзий";
    $len = mb_strlen($str, 'UTF-8');
    $temp = [];
    for ($i = 0; $i < $len; $i++) {
        $temp[] = mb_substr($str, $i, 1, 'UTF-8');
    }
    shuffle($temp);
    $str = join("", $temp);
    echo $str;
    

    【讨论】:

      猜你喜欢
      • 2017-03-15
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      • 2021-07-02
      • 2012-04-30
      • 2012-08-02
      • 2014-12-21
      • 1970-01-01
      相关资源
      最近更新 更多