在json_encode出现故障之前用UTF8字符串对数组进行编码


Encoding an array with UTF8 strings before json_encode trouble

我正在尝试使用array_walk将文本编码为UTF8来处理一组tweet,以便正确处理任何汉字。

array_walk($tweet_data, function(&$tweet, $key) {
    $tweet['text'] = iconv('Windows-1250', 'UTF-8', $tweet['text']);
});

当我这样做时,我会得到错误"在输入字符串中检测到非法字符"

我也尝试过使用utf8_encode

array_walk($tweet_data, function(&$tweet, $key) {
        $tweet['text'] = utf8_encode($tweet['text']);
    });

这一点没有任何问题,但当文本显示在页面上时,字符都是错误的。

如何在传入json_encode之前正确处理UTF8字符,使其不会中断?

这个简单的php函数递归地将数组的所有值转换为UTF8。函数mb_detect_encoding(第4行)检查值是否已经在UTF8中,这样它就不会重新转换。

function utf8_converter($array)
{
    array_walk_recursive($array, function(&$item, $key){
        if(!mb_detect_encoding($item, 'utf-8', true)){
                $item = utf8_encode($item);
        }
    });
    return $array;
}

Windows-1250无法对中文进行编码:

Windows-1250是在Microsoft Windows下用于表示使用中欧和东欧语言的文本拉丁文字,如波兰语、捷克语、斯洛伐克语、匈牙利语、斯洛文尼亚语,波斯尼亚语、克罗地亚语、塞尔维亚语(拉丁文字)、罗马尼亚语(1993年以前拼写改革)和阿尔巴尼亚语。它也可以与德语一起使用语言

ISO-8859-1:也不能

通常用于西欧语言(请参阅下面的列表)。

我认为你正在尝试从A转换为B,但你不知道A是什么。如果你完全确定is还不是UTF-8,你至少应该尝试一种专门为容纳该语言而设计的编码。