带重音符号的记录上带有"b"前缀的字符串



当我转储模型的属性并且它有一个重音时,它返回带有这个"b"前缀

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

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

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

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

更新

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

Route::get('/', function () {
    dd(AppVendasitem::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

如果您已经确认了数据库上的编码。看看config/database.php,字符集和排序规则。

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

如果问题出在"打印"上,那么您可以使用utf8_encode功能。

{{utf8_encode($yourVar)}}

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

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

因此,看起来最好的选择是使用 iconv 为对象编写一个访问器:

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);
} 

使用此函数

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;
    }

最新更新