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

问题描述 投票:10回答:1

当我转储我的模型的属性并且它具有重音时,它返回此“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);

Update

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

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

否则,如果我在控制器或请求和我试过的其他文件中做同样的事情,它会继续使用“b”前缀返回给我

Update 2

如果我保存我的记录,如PROMO - VIRICAPS (GUARANá + POLIVIT) 60 CáPS - CAIXA 18 UNDdump($venda_item->produto->nomeproduto);,它会返回正确的重音结果。

我的所有数据库,包括列都设置为utf8mb4utf8mb4_unicode_ci

php laravel encoding
1个回答
-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);
} 

-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;
    }
© www.soinside.com 2019 - 2024. All rights reserved.