带重音的记录上带有“ b”前缀的字符串

时间:2019-02-13 17:01:06

标签: php laravel encoding

当我转储模型的属性并且带有重音符号时,它会返回此“ b”前缀

dump($venda_item->produto->nomeproduto); // b"teste téste"

我的数据库设置为utf8和utf8_general_ci排序规则

当我在此行以json返回响应时,会导致以下错误Malformed UTF-8 characters, possibly incorrectly encoded

$json_response = Response::json($response, $this->getStatusCode(), $headers);

更新

我发现,如果我死了并将记录转储到网络路由上,它将显示正常的teste téste

Route::get('/', function () {
    dd(App\Vendasitem::where('codigovi', 112685)->first()->produto->nomeproduto);
}

否则,如果我在控制器或请求以及我尝试过的其他文件中执行相同的操作,则会不断返回带有“ b”前缀的信息

更新2

如果我像这样PROMO - VIRICAPS (GUARANá + POLIVIT) 60 CáPS - CAIXA 18 UNDdump($venda_item->produto->nomeproduto);保存记录,它将为我返回带有重音符号的正确结果。

我的所有数据库(包括列)均设置为utf8mb4utf8mb4_unicode_ci

4 个答案:

答案 0 :(得分:1)

如果您已经确认数据库上的编码。看看config/database.php,字符集和归类的专有性。

'charset'   => 'utf8',
'collation' => 'utf8_unicode_ci'

如果问题在“打印件”上,则可以使用utf8_encode函数。

{{utf8_encode($yourVar)}}

答案 1 :(得分:0)

从其他数据库导入数据时遇到了这个问题。用这种方法解决了,也许对您有用。

public function fixEncoding($str) {
        return mb_check_encoding($str, 'UTF-8') 
                ? html_entity_decode($str) 
                : utf8_encode(html_entity_decode($str));
}

答案 2 :(得分:-2)

因此,看来最好的选择是使用write a accessoriconv作为对象:

public function getNomeprodutoAttribute($value) {
   return iconv("utf-8", "utf-8//ignore", $value);
}

除非您想重新编码整个数据库,否则可能无法选择。

传入的值将从数据库中取出值(不幸的二进制数据)。然后,您告诉它输入是utf(它是),输出是utf8(我们想要),但是忽略utf-8不支持的字符。 //ignore可能在该库的某些版本中可用,因此您只需执行以下操作,并希望做到最好:

public function getNomeprodutoAttribute($value) {
   return iconv("utf-8", "utf-8", $value);
} 

答案 3 :(得分:-2)

使用此功能

public function utf8ize($value) {
        if (is_array($value)) {
            foreach ($value as $k => $v) {
                $value[$k] = utf8ize($v);
            }
        } else if (is_string ($value)) {
            return utf8_encode($value);
        }
        return $value;
    }